【问题标题】:Can powershell be used to click an angularjs button?可以使用 powershell 来单击 angularjs 按钮吗?
【发布时间】:2017-08-26 08:32:37
【问题描述】:
<div class="w-btn" ng-click="vm.callbacks.compareAll();" ng-if="vm.folderData.projects.length > 0 &amp;&amp; vm.noneSelectedProjects" tabindex="0"><i class="glyphicon glyphicon-transfer btn-icon"></i> Report from all</div>

我需要使用 Powershell 来单击该按钮。该页面上有多个带有 class="w-btn" 的 div,但只有一个带有比较所有内容的 ng-click。

当该按钮被点击时,它会改变页面上的另一个标签,如下所示

<a href="/data/project/export/projects-tasks?projectIds[]=103473&amp;projectIds[]=103474&amp;projectIds[]=106186&amp;projectIds[]=108395&amp;projectIds[]=110653&amp;projectIds[]=110657" target="_self" class="inline-btn pull-right" ng-if="vm.projects.length > 0">

添加项目时,第一个按钮会更改项目的 href。我必须编写这个脚本来单击第一个按钮,然后使用生成的 href 作为我 wget 中链接的一部分

到目前为止,我还没有做任何事情

$Link = 'https://url.com/folder/2880'
$html = Invoke-WebRequest -Uri $Link -UseDefaultCredentials
$btnclick = $html.getElementsByTagName("div") | Where-object{$_.Name -like 'ng-click="vm.callbacks.compareAll();"' }

当我随后向控制台写入以查看 $btnclick 是什么时,我得到一个错误:

Method invocation failed because [Microsoft.PowerShell.Commands.HtmlWebResponseObject] does not contain a method named 'getElementsByTagName'

最后,我想我会像$btnclick.Click() 一样在href 上再做一个getElement,这样我就可以拉动

/data/project/export/projects-tasks?projectIds[]=103473&amp;projectIds[]=103474&amp;projectIds[]=106186&amp;projectIds[]=108395&amp;projectIds[]=110653&amp;projectIds[]=110657

取出。

感谢任何帮助完成此操作。高级概述是我需要从网页中单击一个 Angular js 按钮,然后从生成的 href 标记中提取一段 URL 以在 wget 中使用。

【问题讨论】:

  • 你试过$html.ParsedHtml.getElementsByTagName('div') |where name -like '…'吗? Invoke-WebRequestMicrosoft.PowerShell.Commands.HtmlWebResponseObject 使用 IE 无头渲染 DOM,除非您添加 -UseBasicParsing,并且返回的对象似乎有 click() 方法。

标签: html powershell


【解决方案1】:

Invoke-WebRequest 在 AngularJS 网页中是无用的,因为有客户端 javascript 渲染。您可以为此使用 powershell + selenium + protractor 的组合(需要 Powershell v5):

# initialize selenium
$protractorPackage = Install-Package Protractor -Destination ".\NugetPackages" -Force -Source 'https://www.nuget.org/api/v2' -ProviderName NuGet
Add-Type -Path ".\Selenium.WebDriver.$($protractorPackage.Where({$_.name -eq "Selenium.WebDriver"}).version)\lib\net40\WebDriver.dll"
Add-Type -Path ".\Protractor.$($protractorPackage.Where({$_.name -eq "Protractor"}).version)\lib\net40\Protractor.dll"

# initialize chrome driver
$chromeDriverPackage = Install-Package Selenium.WebDriver.ChromeDriver -Destination "." -Force -Source 'https://www.nuget.org/api/v2' -ProviderName NuGet
$Env:Path += ";" + ((Resolve-Path ".\Selenium.WebDriver.ChromeDriver.$($chromeDriverPackage.Version)\driver\win32") -join ";")
$Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver

# interact with website
$Selenium.Manage().Timeouts().SetScriptTimeout([TimeSpan]::FromSeconds(15)) # Configure timeouts (important since Protractor uses asynchronous client side scripts)
$Protractor = New-Object Protractor.NgWebDriver($Selenium)
try
{
    $Protractor.Url = "https://url.com/folder/2880"
    $Protractor.WaitForAngular() # sync with angular, this waits for all elements to load

    $Protractor.FindElement([OpenQA.Selenium.By]::CssSelector('[ng-click="vm.callbacks.compareAll();"]')).Click();

    Write-Host "Url is: $($Protractor.Url)"
    $FullhtmlDOM = $Protractor.PageSource
    Write-Host "Full page source: $FullhtmlDOM"
}
finally
{
    $Protractor.Dispose()
}

如果你不想依赖 Chrome 浏览器,你可以使用 headless PhantomJS 代替。它会以同样的方式工作,你只需下载不同的包:

...
# initialize phantomjs driver
$phantomJsDriverPackage = Install-Package Selenium.WebDriver.PhantomJS -Destination "." -Force -Source 'https://www.nuget.org/api/v2' -ProviderName NuGet
$Env:Path += ";" + ((Resolve-Path ".\Selenium.WebDriver.PhantomJS.$($phantomJsDriverPackage.Version)\driver") -join ";")
$Selenium = New-Object OpenQA.Selenium.PhantomJS.PhantomJSDriver
...

【讨论】:

  • 值得一提的是NuGet源默认没有定义,所以如果Install-Package抛出错误,尝试添加参数-Source 'https://www.nuget.org/api/v2' -ProviderName NuGet
  • 感谢示例,我只是修改了安装部分,因为 Protractor nuget install 也带来了 Selenium.WebDriver。
  • Invoke-WebRequestMicrosoft.PowerShell.Commands.HtmlWebResponseObject 使用 IE 无头渲染 DOM,除非您添加 -UseBasicParsing
【解决方案2】:

如果你对 IE 没问题 看起来创建一个 IE COM 对象会得到你想要的。

$ie = New-Object -ComObject "InternetExplorer.Application"
$ie.Navigate("URL GOES HERE")
$Document = $ie.document
$Document.GetElementsByTagName('div')

如果你想让它可见:

$ie.visible = $True

这是关于 COM 对象的 Microsoft 页面

https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx

还有一个关于在 powershell 中使用它。

https://blogs.msdn.microsoft.com/luisdem/2016/02/09/browsing-in-internet-explorer-via-powershell/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2017-08-30
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多