Подтвердить что ты не робот

Можно ли использовать кнопку powershell для нажатия кнопки angularjs?

<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", но только один с ng-кликом, в котором есть Сравнить все в нем.

когда эта кнопка нажата, она изменит другой тег на странице, который выглядит следующим образом

<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 для проектов по мере их добавления. Я должен написать этот script, чтобы щелкнуть первую кнопку, а затем использовать полученный 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() и сделать еще один getElement на href, чтобы я мог вытащить

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

.

Любая помощь в этом достигается. Обзор высокого уровня - мне нужно щелкнуть кнопку angular js с веб-страницы, а затем извлечь часть URL-адреса, которая будет использоваться в wget из полученного тега href.

4b9b3361

Ответ 1

Invoke-WebRequest в веб-страницах AngularJS бесполезно, так как есть рендеринг javascript на стороне клиента. Вы можете использовать комбинацию powershell + селен + транспортир для этого (требуется 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, вместо этого вы можете использовать безголовый 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
...

Ответ 2

Если ваш тон с IE. Кажется, создание IE-COM-объекта получит то, что вы хотите.

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

Если вы хотите, чтобы он был видимым:

$ie.visible = $True

Вот страница Microsoft в COM-объекте

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/