天天登陸OA太繁瑣,公司OA又只容許用IE,自己寫chrome擴展水平也不高,更搞不懂seleniumhtml
既然是windows下工做,固然還得微軟的東東。研究了幾天,才發現用powershell就很方便。chrome
閒話少說:首先在運行中輸入powershell,打開Windows PowerShell ISEshell
默認狀況下不能直接運行,先在ISE的命令行輸入編程
set-executionpolicy remotesigned
如今能夠編寫、保存和運行powershell腳本了。windows
#IE運行時的等待函數 function Wait($ie){ sleep 2 do{ sleep -Mi 200 }while($ie.Busy) } #打開新IE窗口的函數 function NavigateIE($url) { $ie = new-object -com "InternetExplorer.Application"; $ie.navigate($url); $ie.Visible=$true; [System.Threading.Thread]::Sleep(2000); return $ie; } #腳本開始 $ie = NavigateIE('www.baidu.com') #獲取百度搜索框 $inputs=$ie.Document.getElementsByName('wd') foreach($element in $inputs){ $element.value="我要搜索powershell" }
實際應用中遇到的困難有:安全
有時僅用Wait函數還不夠,再加上等待的語句dom
[System.Threading.Thread]::Sleep(1000);
有的網頁元素沒有ID,就用getElementsByTagName,如編程語言
$ie2 = NavigateIE("http://www.baidu.com"); [System.Threading.Thread]::Sleep(1000); $doc2 = $ie2.document $inputs = $doc2.getElementsByTagName("input") foreach($el in $inputs) { $namestr = $el.type Write-Host $namestr if($namestr.Equals("button")) { $el.click() } }
網頁中有iframe,要用到contentDocument,這個問題困擾我好幾天函數
#模擬點擊iframe中審批類流程的more $frame1 = $ie.Document.getElementById('Frame123').contentDocument; $frame1.getElementById('more_888').click()
還有的網頁有frameset,又困擾了半天,可用如下代碼先找到其中的frame加密
$frame = $ie.Document.frames.document.body.childNodes.item(3).childNodes.item(3)
好比有個網頁中frameset下有frame,下面又有iframe,用如下語句才取得最後一個有ID的元素
$ie.Document.frames.document.body.childNodes.item(3).childNodes.item(3).contentDocument.getElementById('iFrameList').contentDocument.getElementById('tabTask')
獲取相應alt屬性的img元素
$imgs = $ie.Document.frames.document.body.childNodes.item(3).childNodes.item(3).contentDocument.getElementById('iFrameList').contentDocument.body.getElementsByTagName("img") $imgs |Where-Object{$_.alt -eq "查看流程"}| ForEach-Object{$_.alt}
除了直接在命令行輸入變量名外,可用如下語句查看變量$i的方法和屬性
$i |Get-Member
或輸出到文件中更方便看
#省略d:\的話,會在當前腳本目錄下生成1.txt $i |Get-Member |out-file d:\1.txt
在網址包含某個值以前,讓腳本循環等待
function WaitUrl($ie,$url){ sleep 2 do{ sleep -Mi 200 }while( $ie.LocationURL -notlike '*'+$url+'*') }
啓動應用程序
Start-Process "D:\Program Files (x86)\aaa\bbb.exe"
如我電腦上的廣訊通不是開機自啓動,就放在腳本中啓動
function gxt(){ $gxt = Get-Process | ?{$_.ProcessName -eq "GXT"} if($gxt -eq $null){ Start-Process "C:\Program Files (x86)\Glodon\GXT\bin\GXT.exe" } }
還有就是登陸某些網頁時的windows認證的問題,總時彈出windows安全提示框,要求輸入用戶名和密碼
我但願最好是能模擬輸入和點擊肯定,但實現不了。最後只能加個循環等待手工輸入後繼續後面的工做,冏囧
參考了http://www.cnblogs.com/Joe-T/archive/2011/12/29/2283408.html,仍未解決
原創部分結束
===========================================================
如下是從網上搜來的內容:
Powershell 定義文本
使用雙引號,可讓本身的定義的字符中的變量被內容替換;
$site
=
"飛苔博客 Powershell博客"
$text
=
"$site $(get-date) $env:windir"
$text
輸出:
飛苔博客 Powershell博客 08/25/2012 18:49:41 C:windows
2. 使用單引號,可讓本身的定義的字符串原樣輸出;
$text
=
'$fei $(tai) $env:windir 飛苔博客 (20+2012)'
$text
輸出:
$fei $(tai) $env:windir 飛苔博客 (20+2012)
3. 文本中的兩種特殊字符, 一個是變量的前綴「$」,一個是反引號「·」位於數字鍵1左邊。
PS C:\> "computer name:$env:computername"
computer name: computer1
PS C:\> "current date:$(get-date)"
current date:05/07/2015 09:47:11
4. Powershell轉義字符
在其它編程語言中喜歡將反斜槓做爲轉義字符,可是在Powershell中扮演轉義字符角色的不是反斜槓,而是反引號「`」字符串中的反引號,會對緊跟隨其後的字符進行特殊處理。
#使用單引號閉合字符串輸出雙引號
'The site of my blog is"www.mossfly.com"'
#使用轉義字符輸出雙引號
「My blog site is`
"www.mossfly.com`""
#在字符串中輸出換行符
「The site of my blog is `"www.mossfly.com`",`n飛苔博客"
輸出:
The site of my blog is」www.mossfly.com」
My blog site is」www.mossfly.com」
The site of my blog is 「www.mossfly.com」,
飛苔博客
5. Powershell轉義字符表
轉義字符 | 描述 |
`n | 換行符 |
`r | 回車符 |
`t | 製表符 |
`a | 響鈴符 |
`b | 退格符 |
`’ | 單引號 |
`」 | 雙引號 |
`0 | Null |
「 | 反引號自己 |
6. PowerShell中strings 定義多行文本
@「字符串」@格式定義多行文本,尤爲是較長的文本,再好不過了,這裏要注意開始和結束的標記必須另起一行。
@"
這首詩用來評價陶淵明的詩歌再好不過了
一語自然萬古新,豪華落盡見真淳。
南窗白日羲皇上,未害淵明是晉人。
"@
7. PowerShell中用戶的交互
若是要提示用戶輸入可使用read-host
PS E:> $name=Read-Host "請輸入您的用戶名"
請輸入您的用戶名: Mosser Lee
PS E:> "您輸入的用戶名爲:$name"
您輸入的用戶名爲:Mosser Lee
如何解析read-host中的變量?以經過ExpandString方法解析
PS E:> $inputPath=Read-Host "請輸入文件路徑"
請輸入文件路徑: $env:windir
PS E:> $inputPath
$env:windir
PS E:> $ExecutionContext.InvokeCommand.ExpandString($inputPath)
C:windows
如何將加密的密碼轉換爲普通文本?
PS E:> $pwd=Read-Host -AsSecureString "請輸入密碼"
請輸入密碼: ******
PS E:> $pwd
System.Security.SecureString
PS E:> [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd))
abc123
若是你想受權一個用戶須要提供用戶憑據,可使用Get-Credential命令,該命令會彈出一個安全對話框,一旦用戶輸入完畢,就會返回一個Credential對象包含用戶名和密碼
PS E:> $cre=Get-Credential MossserLee
PS E:> $cre
UserName Password
-------- --------
MossserLee System.Security.SecureString
如何輕鬆的得到用戶憑據,不須要用戶交互的輸入?
Function Get-DomainCredential()
{
$domain=Get-DomainName
$username = "$domain\administrator"
$password = "123456"
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))
return $cred
}
本文出自 「Ricky's Blog」 博客,請務必保留此出處http://57388.blog.51cto.com/47388/1643717