每天登入OA太繁瑣,公司OA又只允許用IE,本身寫chrome擴充套件水平也不高,更搞不懂selenium
既然是windows下工作,當然還得微軟的東東。研究了幾天,才發現用powershell就很方便。
閒話少說:首先在執行中輸入powershell,開啟Windows PowerShell ISE
預設情況下不能直接執行,先在ISE的命令列輸入
set-executionpolicy remotesigned
現在可以編寫、儲存和執行powershell指令碼了。
#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函式還不夠,再加上等待的語句
[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