每天登入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 定義文字

  1. 使用雙引號,可以讓自己的定義的字元中的變數被內容替換;

$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