所以我正在使用jenkins中的powershell进行一些自动化测试。我正在测试一个Web应用程序,我必须填写表单,检索值等。
一切都很好,但Web应用程序包含一些偶尔出现的弹出消息,这会导致主脚本冻结,直到在应用程序中手动关闭它们。下面是一个带有类似问题的堆栈溢出线程的链接。
Powershell Website Automation: Javascript Popup Box Freeze
我遵循了第一个答案的建议。我创建了一个单独的PowerShell脚本,它不断执行,并且可以判断是否存在弹出窗口(因为它们有自己的进程ID,因此如果有多个iexplore进程ID存在则必须是弹出窗口)然后使用发送密钥关闭它。
主脚本示例:
#start application
start C:\Users\Webapp
#start the monitor script
Start-Process Powershell.exe -Argumentlist "-file C:\Users\Monitor.ps1"
#Get app as object
$app = New-Object -ComObject Shell.Application
$ClientSelectPage = $app.Windows() | where {$_.LocationURL -like "http:webapp.aspx"}
#Input value to cause popup message
$MemNumberInput = $ClientSelectPage.Document.getElementByID("MemNum")
$MemNumberInput.Select()
$MemNumberInput.value = "22"
$FindBtn.click()
此时我的脚本将冻结(因为弹出窗口出现告诉我信息abotu我插入的客户端)如果这个弹出窗口可以看作是一个进程,监视器代码将关闭它。
监视器示例
$i = 0
while($i -eq 0)
{
#Check what process are currently running under the webapps name
$Mainprocid = Get-Process | where {$_.mainWindowTitle -like "*webapp*" } | select -expand id
$Mainprocid.COUNT
$integer = [int]$Mainprocid
#If there is only one process, no action
if( $Mainprocid.count -eq 1)
{
echo "no popup"
}
else
{
if($integer -eq '0')
{
#If there are no processes close the script
$i = 1
echo "close process"
}
else
#If there are two processes one must be a pop, send 'enter' to the app
{
echo "POP UP!"
$title = Get-Process |where {$_.mainWindowTItle -like "*webapp*"}
#Code to sendkeys 'ENTER' to the application to close the popup follows here
}
}
}
但是,无论出于何种原因,某些弹出窗口都无法作为进程找到,并且监视器脚本对它们无用。这些是很少的,所以我认为最好的方法是监视脚本检查并查看主脚本是否已冻结一段时间。如果是这样,它可以使用它为其他弹出窗口执行的sendkeys方法。
我可以通过监视器脚本检查并查看主脚本是否已冻结?我知道我可以不时地从主脚本中传递一个参数,让监视器脚本知道它仍处于活动状态,但这似乎是一种混乱的方式,而且另一种方法更可取。
两个脚本都保存为.ps1文件。