<div class="w-btn" ng-click="vm.callbacks.compareAll();" ng-if="vm.folderData.projects.length > 0 && vm.noneSelectedProjects" tabindex="0"><i class="glyphicon glyphicon-transfer btn-icon"></i> Report from all</div>
我需要使用Powershell单击该按钮。 该页面上有多个div,其中 class="w-btn",但只有一个带有 ng-click 的div 包含"全部比较"。
单击该按钮时,它将更改页面上的另一个标签,如下所示
<a href="/data/project/export/projects-tasks?projectIds[]=103473&projectIds[]=103474&projectIds[]=106186&projectIds[]=108395&projectIds[]=110653&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&projectIds[]=103474&projectIds[]=106186&projectIds[]=108395&projectIds[]=110653&projectIds[]=110657
部分。
任何帮助完成这项工作将不胜感激。 高级概述是我需要从网页中单击一个角度 js 按钮,然后从生成的 href 标签中提取一段要在 wget 中使用的 URL。
AngularJS网页中的Invoke-WebRequest
是无用的,因为有客户端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)libnet40WebDriver.dll"
Add-Type -Path ".Protractor.$($protractorPackage.Where({$_.name -eq "Protractor"}).version)libnet40Protractor.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)driverwin32") -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浏览器,则可以改用无头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
...
如果你对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/