PowerShell script to download from Web - powershell

I am trying to log on web page using PowerShell and generate some. Although Powershell ISE gives some errors, current script works okay(sometimes log on sometimes not) but last part seem doesn't work to generate the Report by clicking the "CSV" Button.
Any help please?
$username = "username"
$password = "password"
$ie = New-Object -ComObject InternetExplorer.Application
$ie.visible=$true
$ie.navigate("http://..../login")
while($ie.ReadyState -ne 4) {start-sleep -m 300}
$ie.document.IHTMLDocument3_getElementById('user_session_email').Value=$username
$ie.document.IHTMLDocument3_getElementById('user_session_password').Value=$password
$ie.Document.IHTMLDocument3_getElementById('commit').Click()
$ie.navigate("http://..../activity_reports")
while($ie.ReadyState -ne 4) {start-sleep -m 100}
$currentDate= (Get-Date).ToString('dd-MM-yyyy')
$ie.document.IHTMLDocument3_getElementById('from_date').innertext= $currentDate
$ie.document.IHTMLDocument3_getElementById('to_date').Value=$currentDate
$Link=$ie.Document.IHTMLDocument3_getElementByType('submit') | where-object {$_.class -eq 'btn
btn-default btn-sm'}
$Link.click()

Related

IE Automation with Powershell send ENTER Key

I am doing an IE Automation with ServiceNow where there is an option to fill the search data but there is no search button available to use the CLICK method. So I am looking for the method to enter key like {ENTER} or {~} once I filled the search data. But I am in a middle stage of PowerShell scripting and not sure how to use that.
If someone could help me with the method that would be greatly appreciate.
$IE = New-Object -ComObject InternetExplorer.application
$IE.FullScreen = $false
$IE.Visible = $true
$IE.Navigate($ServiceNowURL)
While ($IE.Busy -eq $true)
{
Start-Sleep -Milliseconds 50
}
$Enter = Read-Host 'To continue press ENTER'
#Enter
$Search = $IE.Document.IHTMLDocument3_getElementsByTagName('input') | ? {$_.id -eq 'sysparm_search'}
$EnterValue = $Search.value() = $TicketNumber
First, you need to active IE window and bring it to front using AppActivate, then set focus to the search area using focus(). After that, you can send Enter key using SendKeys.
I use https://www.google.com to search as an example and you can refer to my code sample below. I test it and it works well:
[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
$ie = New-Object -ComObject 'InternetExplorer.Application'
$ie.Visible=$true
$ie.Navigate("https://www.google.com") #change it to your own url
while($ie.ReadyState -ne 4 -or $ie.Busy) {Start-Sleep -m 100}
$search=$ie.Document.getElementsByName("q")[0] #change it to your own selector
$search.value="PowerShell" #change it to your own search value
Sleep 5
$ieProc = Get-Process | ? { $_.MainWindowHandle -eq $ie.HWND }
[Microsoft.VisualBasic.Interaction]::AppActivate($ieProc.Id)
$search.focus()
[System.Windows.Forms.SendKeys]::Sendwait("{ENTER}");

using powershell Save file on IE bypassing Download Popup

I am trying to download file on IE Version 21H from Website using powershell.
when I click Download button using powershell, it asks me for download Popup window with below massage.
You Want to Open or Save XYZ.log from www.XYZ.com
below is the code I am using
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Visible=$true
$ie.Navigate("www.xyz.com/ab/sder23445sdfrty") #please note this is random URL I provided
$link=$ie.Document.getElementsByTagName("Button") | where-object {$_.outerhtml -like "*download*"}
$link.click()
You can first active the IE window and bring it to front using AppActivate, then using SendKeys to send keystrokes Ctrl+S to save the file.
The sample code is like below, you can change the url and element selector to your owns:
[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Visible=$true
$ie.Navigate("https://www.example.com/download.html") #change it to your own url
while($ie.ReadyState -ne 4 -or $ie.Busy) {Start-Sleep -m 100}
$link=$ie.Document.getElementById("btnDowload") #change it to your own selector
$link.click()
Sleep 5
$ieProc = Get-Process | ? { $_.MainWindowHandle -eq $ie.HWND }
[Microsoft.VisualBasic.Interaction]::AppActivate($ieProc.Id)
[System.Windows.Forms.SendKeys]::Sendwait("%{s}");

Need help to Convert Powershell IE auto login script to firefox having same function

I am successfully getting my scenario on below powershell script to auto login to the website xyz.com via IE but some functionality are not working properly, whereas firefox is doing same job perfectly. hence need help to convert the same script to perform same job in firefox browser using powershell.
$ie = New-Object -ComObject 'internetExplorer.Application'
$ie.Visible= $true # Make it visible
$username="username"
$password="password"
$Tenant="abcdefgh"
$ie.Navigate("htt:/xyz.com/login") ## website is taken as example
While ($ie.Busy -eq $true) {Start-Sleep -Seconds 3;}
$usernamefield = $ie.document.getElementByID('txtudsr')
$usernamefield.value = "$username"
$passwordfield = $ie.document.getElementByID('txtpswd')
$passwordfield.value = "$password"
$Tenantfield = $ie.document.getElementByID('txttfenant')
$Tenantfield.value = "$Tenant"
$Link = $ie.document.getElementByID('btn_login')
$Link.click()
While ($ie.Busy -eq $true) {Start-Sleep -Seconds 30;}
$Link = $ie.document.getElementByID('btn_Continue')
$Link.click()
While ($ie.Busy -eq $true) {Start-Sleep -Seconds 10;}
$Link = $ie.document.getElementByID('statusUnAvailable')
$Link.click()
$ie.Quit()
I don't think it's a good idea do the same on firefox as you do for IE.
Your best friend will be selenium, it is the modern way to do browser automation nowadays.
I normally use selenium on Python, but there are some articles about selenium on PowerShell too. Just google it.
https://github.com/adamdriscoll/selenium-powershell
https://gist.github.com/Jaykul/d16a390e36ec3ba54cd5e3f760cfb59e

Download an Excel document from website with Powershell

recently I began to learn PowerShell to automate my job tasks.
So I want to access a web page and click on a button that download automatically an Excel file. This is the button that I want to click on:
<div class="NormalButton">
<a class="ActiveLink" title="Excel" alt="Excel" onclick="$find('ctl32').exportReport('EXCELOPENXML');" href="javascript:void(0)" style="padding:3px 8px 3px 8px;display:block;white-space:nowrap;text-decoration:none;">Excel</a>
</div>
This would be my PowerShell script:
$ie = New-Object -com "InternetExplorer.Application"
$ie.Navigate("http://test.test/")
$ie.Visible = $true
$link = $ie.Document.getElementsByTagName('a') | Where-Object {$_.onclick -eq "$find('ctl32').exportReport('EXCELOPENXML');"}
$link.click()
If I try to run it from the console I receive the error "You cannot call a method on a null-valued expression."
If its useful I'm using PowerShell 4.0 and the webpage has a delay until the report is loaded.
I have completed it by the following code:
[void][System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[void][System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
$url = "https://webpage.com"
$ie = New-Object -com internetexplorer.application
$ie.navigate($url)
$ie.StatusBar = $false
$ie.ToolBar = $false
$ie.visible = $true
#Get Excel
Start-Sleep -s 40
$btnExcel = $ie.Document.links | where-object { $_.outerText -eq 'Excel' -and $_.innerText -eq 'Excel' }
$btnExcel.click()
# Get Internet Explorer Focus
Start-Sleep -s 5
[Microsoft.VisualBasic.Interaction]::AppActivate("internet explorer")
[System.Windows.Forms.SendKeys]::SendWait("{F6}");
[System.Windows.Forms.SendKeys]::SendWait("{TAB}");
[System.Windows.Forms.SendKeys]::SendWait(" ");
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait("$file");
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}");
# Get Internet Explorer Focus
Start-Sleep -s 1
[Microsoft.VisualBasic.Interaction]::AppActivate("internet explorer")
[System.Windows.Forms.SendKeys]::SendWait("^{F4}");
Thank you all for you time :)
I Think the Your problem is because you are using Double Quotes which powershell threat it like variable and Try to expand it, so try to change it to Single quote, from:
$link = $ie.Document.getElementsByTagName('a') | Where-Object {$_.onclick -eq "$find('ctl32').exportReport('EXCELOPENXML');"}
to:
$link = $ie.Document.getElementsByTagName('a') | Where-Object {$_.onclick -eq '$find('ctl32').exportReport('EXCELOPENXML');'}
Also, you can change the -eq to -match and take just a portion of it like:
$_.onclick -match '$find('ctl32').exportReport'
For more information see: About Quoting Rules

Windows 10 powershell IE 11 object

Here is the batch code:
<# :
#echo off
powershell /nop /ex bypass^
"&{[ScriptBlock]::Create((gc '%~f0') -join [Char]10).Invoke()}"
exit /b
#>
$ie = new-object -comobject InternetExplorer.Application
$ie.Visible = $false
$ie.Silent = $true
while($ie.Busy -ne $false) {start-sleep -m 100}
$ie.Navigate2("https://www.google.ru/", 4)
while($ie.Busy -ne $false) {start-sleep -m 100}
while($ie.ReadyState -ne 4) {start-sleep -m 100}
start-sleep -m 500
$ie.Stop()
echo $ie.Document.body.innerHTML > ".\html.txt"
$ie.Quit()
This code works fine in Windows 7 x64, Windows 8 x64, but not work in Windows 10 x64. Microsoft EDGE browser is not using, IE 11 is selected as default browser. I tried to run bat-file as administrator and as invoker.. What is wrong? Thanks for your help!
If you only need to retrieve the HTML content of a web page, don't use a web browser at all. Instead, use invoke-webrequest and access the content property of the resulting object.
invoke-webrequest -Uri http://www.google.ru/ | select-object -property content