2017-08-16 10 views
10
<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> 

muszę używać PowerShell kliknąć ten przycisk. Na tej stronie znajduje się wiele elementów div z klasą = "w-btn", ale tylko jedna z ng-click, która zawiera Porównaj wszystkie.Czy do kliknięcia przycisku angularjs można użyć powershell?

kiedy to kliknięciu przycisku zmieni kolejny tag na stronie, która jest niczym następujących

<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"> 

pierwszych zmian przycisk, który href dla projektów, jak się dodaje. Muszę napisać ten skrypt kliknij pierwszy przycisk, a następnie za pomocą uzyskanego href jako część linku w moim wget

do tej pory nie udało nam się dostać coś do pracy

$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();"' } 

kiedy i wtedy zrobić zapis do konsoli, aby zobaczyć, co $ btnclick to pojawia się błąd:

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

końcu, myślę, że wtedy zrobić jak $btnclick.Click() i zrobić kolejny getElement na href więc mogę wyciągnąć

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

część na zewnątrz.

Każda pomoc w wykonaniu tego zadania jest doceniana. Przegląd ogólny wysokiego poziomu polega na tym, że muszę kliknąć przycisk z boku strony, a następnie wyodrębnić fragment adresu URL, aby użyć wget z wynikowego tagu href.

Odpowiedz

8

Invoke-WebRequest w angularjs stronach jest bezużyteczne, ponieważ nie ma po stronie klienta javascript renderowania. Można użyć kombinacji PowerShell + selen + kątomierz za to (PowerShell v5 wymagane):

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

jeśli nie chcesz polegać na przeglądarce Chrome, można zamiast tego użyć bezgłowe PhantomJS. Będzie ona działać w ten sam sposób, po prostu pobrać różne pakiety:

... 
# 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 
... 
+0

Warto wspomnieć źródło Nuget nie jest zdefiniowana domyślnie, więc jeśli 'Install-Package' zgłasza błąd, spróbuj dodać parametry' -source „https://www.nuget.org/api/v2 '-ProviderName NuGet' –

+0

Uaktualniłem odpowiedź, dziękuję –

+0

Dzięki za przykład, po prostu modyfikuję część instalacyjną, ponieważ Kątomierz instalacyjny nuget przynosi również Selenium.WebDriver. – JPBlanc

0

Jeśli dobrze z IE to wydaje się stworzenie obiektu COM IE dostanie to, co chcesz.

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

Jeśli chcesz to widoczne:

$ie.visible = $True 

Oto strona Microsoft na obiekt COM

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

i jeden na użycie go w PowerShell.

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

Powiązane problemy