Html 是否可以使用powershell单击angularjs按钮?

Html 是否可以使用powershell单击angularjs按钮?,html,powershell,Html,Powershell,然后,当我写入控制台以查看$BTN是什么时,我得到一个错误: $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();"' } 最后,

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

$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.Click()
,然后在
href
上执行另一个
getElement
,这样我就可以拉

分出来


任何帮助完成这项工作的人都将不胜感激。高级概述是,我需要从网页中单击AngularJS按钮,然后从生成的a href标记中提取一段URL以在wget中使用。

在AngularJS网页中调用WebRequest
是无用的,因为存在客户端javascript呈现。您可以将powershell+selenium+量角器组合使用(需要powershell v5):

如果你不想依赖Chrome浏览器,你可以使用无头幻影。它将以同样的方式工作,您只需下载不同的软件包:

# 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()
}

如果你对IE很满意,那么创建IE COM对象就会得到你想要的

...
# 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 = New-Object -ComObject "InternetExplorer.Application"
$ie.Navigate("URL GOES HERE")
$Document = $ie.document
$Document.GetElementsByTagName('div')
这是COM对象上的Microsoft页面

还有一个是在powershell中使用它


值得一提的是,默认情况下未定义NuGet源代码,因此如果
安装包
抛出错误,请尝试添加参数
-source'https://www.nuget.org/api/v2'-ProviderName NuGet
感谢您的示例,我只是修改了安装部分,因为Digrator nuget install也带来了Selenium.WebDriver.
调用WebRequest
的Microsoft.PowerShell.Commands.HtmlWebResponseObject使用IE无头渲染DOM,除非添加
-UseBasicParsing
。您尝试过
$html.ParsedHtml.getElementsByTagName('div')吗|名称在哪里-如“…”
Invoke WebRequest
的Microsoft.PowerShell.Commands.HtmlWebResponseObject使用IE无头呈现DOM,除非您添加
-UseBasicPassing
,并且返回的对象似乎具有
click()
方法。
/data/project/export/projects-tasks?projectIds[]=103473&projectIds[]=103474&projectIds[]=106186&projectIds[]=108395&projectIds[]=110653&projectIds[]=110657
# 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()
}
...
# 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 = New-Object -ComObject "InternetExplorer.Application"
$ie.Navigate("URL GOES HERE")
$Document = $ie.document
$Document.GetElementsByTagName('div')
$ie.visible = $True