Summary: How to Implement Automatic Testing using Selenium and PowerShell in Azure DevOps Server pt 2
Date: Around 2020
Refactor: 29 April 2025: Checked links and formatting. Rebranded Team Foundation Server (TFS) to Azure Devops Server.
This page is a followup on Implement Automatic Testing using Selenium and PowerShell in Azure DevOps Server and will only note the differences.
First thing is to add the PowerShell script to the TFS Code Repostory. Go to Code → PowerShell folder (create it if it doesn't exist yet). Create a new file as seleniumtestauth.ps1 and add the code (see below the code for necessary explanation:
Param( [string]$linkedinuser, [string]$linkedinpass ) # Check for.net version of minimum 4.5: if (!(Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\' | Get-ItemPropertyValue -Name Release | Foreach-Object { $_ -ge 394802 })){ exit }else{ write-host "mimimum .net 4.5 version found. Continue" } # Load the Selenium .Net library and paths to the various test libraries # webdriver & support dll Add-Type -Path "D:\selenium\WebDriver.dll" Add-Type -Path "D:\selenium\WebDriver.Support.dll" # Add path for chromedriver.exe and firefox geckodriver.exe $env:PATH += ";D:\selenium" # Testplan variables $testurl = "https://www.linkedin.com/uas/login" $testname = "linkedin" $resultsdir = "D:\selenium\testresults" [OpenQA.Selenium.ScreenshotImageFormat]$ImageFormat = [OpenQA.Selenium.ScreenshotImageFormat]::Png ### Firefox testplan ######################################################################################################### # Start firefox headless Write-Host "Start firefox testplan, starting firefox headless" [OpenQA.Selenium.Firefox.FirefoxOptions]$ffoptions = new-object OpenQA.Selenium.Firefox.FirefoxOptions $ffoptions.addArguments('-headless') $ffdriver = New-Object OpenQA.Selenium.Firefox.FirefoxDriver ($ffoptions) # Sometimes headless doesn't work through arguments. Setting the headless environment variable to make sure we're headless $env:MOZ_HEADLESS = 1 # Start firefox testplan Write-Host "Go to url $testurl" $ffdriver.Navigate().GoToURL($testurl) Write-Host "Log in at $testurl" $ffdriver.FindElementByName("session_key").SendKeys($linkedinuser) $ffdriver.FindElementByName("session_password").SendKeys($linkedinpass) $ffdriver.FindElementByName("session_password").Submit() # This might take a few moments sleep 5 # Get Evidence that the website works $ffcurrenturl = $ffdriver.url $ffcurrenturltitle = $ffdriver.title Write-Host "Current FF url $ffcurrenturl and title $ffcurrenturltitle" # Get Pagesource Write-Host "Create pagesource $ffcurrenturl" $ffdriver.PageSource | Out-File "$resultsdir\ff$testname.html" -Force # Get Screenshots Write-Host "Create screenshot $ffcurrenturl" $Screenshot = [OpenQA.Selenium.Support.Extensions.WebDriverExtensions]::TakeScreenshot($ffdriver) $Screenshot.SaveAsFile("$resultsdir\ff$testname.png", $ImageFormat) # Close firefox Write-Host "Close and quit firefox browser and selenium webdriver. " $ffdriver.Close() $ffdriver.Quit() ### Chrome testplan ######################################################################################################### # Start Chrome headless Write-Host "Start chrome testplan, starting chrome headless" $chromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions $chromeOptions.addArguments('headless') $chromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($chromeOptions) # Start chrome testplan Write-Host "Go to url $testurl" $chromedriver.Navigate().GoToURL($testurl) Write-Host "Log in at $testurl" $chromeDriver.FindElementByName("session_key").SendKeys($linkedinuser) $chromeDriver.FindElementByName("session_password").SendKeys($linkedinpass) $chromeDriver.FindElementByName("session_password").Submit() # This might take a few moments sleep 5 # Get Evidence that the website works $chromecurrenturl = $chromeDriver.url $chromecurrenturltitle = $chromeDriver.title Write-Host "Current Chrome url $chromecurrenturl and title $chromecurrenturltitle" # Get Pagesource Write-Host "Create pagesource $chromecurrenturl" $chromeDriver.PageSource | Out-File "$resultsdir\chrome$testname.html" -Force # Get Screenshots Write-Host "Create screenshot $chromecurrenturl" $Screenshot = [OpenQA.Selenium.Support.Extensions.WebDriverExtensions]::TakeScreenshot($chromeDriver) $Screenshot.SaveAsFile("$resultsdir\chrome$testname.png", $ImageFormat) # Close Chrome Write-Host "Close and quit chrome browser and selenium webdriver. " $chromeDriver.Close() $chromeDriver.Quit()
The script performs the following steps:
Get-WindowsFeature -name NET* | where installed
While testing manually you can use the following code to enter your credentials:
# Get LinkedIn Credentials $PSCred = Get-Credential -Message 'Enter LinkedIn Username and Password'
And then use this code for logging in with firefox:
$ffdriver.FindElementByName("session_key").SendKeys($PSCred.Username) $ffdriver.FindElementByName("session_password").SendKeys($PSCred.GetNetworkCredential().password) $ffdriver.FindElementByName("session_password").Submit()
And then use this code for logging in with chrome:
$chromeDriver.FindElementByName("session_key").SendKeys($PSCred.Username) $chromeDriver.FindElementByName("session_password").SendKeys($PSCred.GetNetworkCredential().password) $chromeDriver.FindElementByName("session_password").Submit()
We need to set the script on the build server so it can be run during the release. We need to do so now because the powershell folder is not included in the artifact. In the build definition, click “+ Add Task” and search for “Copy Files”. Click the “Copy Files” task and click Add. Configure the task like this:
Create two variables in the Release definition and name them linkedinuser and linkedinpass and provide them with the correct values. Don't forget to set the linkedinpass as a secret (by clicking the lock).
In the release definition, in the newly created Agent Phase, click “+” and search for “PowerShell”. Click the “PowerShell” task and click Add. Configure the task like this:
Again, check Implement Automatic Testing using Selenium and PowerShell in Azure DevOps Server for all other steps that are required.