diff --git a/ChangeLog.md b/ChangeLog.md index 357d16b..011923f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,29 @@ - +# 4.0.0-preview3 +## Added / Modified +- Get-SeElementAttribute now return a hashtable instead of a pscustom object when multiple attributes are queried + + + +## Fixes +- Get-SeElement now make use of Get-SeElementAttribute internally to query attributes. +- Get-SeElement error when using filter / attribute +- Update-SeDriver default path typo (#206) +- New-SeScreenshot documentation update (#200) +- Casing issue with Types.ps1xml filename (#203) + +# 4.0.0-preview2 (Prerelease) +## Added / Modified +- Get-SeElement -Filter; Add a new parameter to do additional filtering before returning. This is equivalent to doing a Where afterward but with the Get-SeElement error management logic applied before returning. (#192) +- AcceptInsecureCertificates switch added to Start-SeDriver / New-SeDriverOptions (Supported by: Chrome, Firefox, Edge) (#189) +- Chrome web drivers assemblies updated to latest version + +## Fixes +- Starting Edge browser broken (#188,#195) +- custom driver options, when specified, are not used (#191,#193) +- Processes management internal logic error (#190) +- Get-SeInput not working properly with -Single switch (#186) +- Screenshots fail when attempting to screenshot the page (#187) # 4.0.0-preview1 (Prerelease) Note: V4 have an enormous amount of breakchanges. Most of the cmdlet have been rewriten in a way or another. diff --git a/Help/ConvertTo-SeSelenium.md b/Help/ConvertTo-SeSelenium.md index 8afff96..9466af4 100644 --- a/Help/ConvertTo-SeSelenium.md +++ b/Help/ConvertTo-SeSelenium.md @@ -17,7 +17,7 @@ ConvertTo-Selenium [-Path] [] ``` ## DESCRIPTION -{{ Fill in the Description }} +Convert Selenium IDE .side recording file to PowerShell commands. ## EXAMPLES diff --git a/Help/Get-SeElement.md b/Help/Get-SeElement.md index c9b1322..6187e5b 100644 --- a/Help/Get-SeElement.md +++ b/Help/Get-SeElement.md @@ -16,13 +16,13 @@ Finds all IWebElements within the current context using the given mechanism ### Default (Default) ``` Get-SeElement [-By ] [-Value] [[-Timeout] ] [-All] [-Attributes ] - [-Single] [] + [-Filter ] [-Single] [] ``` ### ByElement ``` Get-SeElement [-By ] [-Value] [-Element] [-All] - [-Attributes ] [-Single] [] + [-Attributes ] [-Filter ] [-Single] [] ``` ## DESCRIPTION @@ -131,6 +131,21 @@ Accept pipeline input: True (ByValue) Accept wildcard characters: False ``` +### -Filter +Filter the obtained output with additional conditions. This is equivalent to doing a Where-Object afterward with the benefit of going trough the Get-SeElement error management. + +```yaml +Type: ScriptBlock +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Single Expectation that only one element will be returned. An error will be returned if that parameter is set and more than one corresponding element is found. diff --git a/Help/New-SeDriverOptions.md b/Help/New-SeDriverOptions.md index e31dcb2..4e47e91 100644 --- a/Help/New-SeDriverOptions.md +++ b/Help/New-SeDriverOptions.md @@ -17,7 +17,7 @@ New-SeDriverOptions [-Browser ] [[-StartURL] ] [-State ] [-DefaultDownloadPath ] [-PrivateBrowsing] [-ImplicitWait ] [-Size ] [-Position ] [-WebDriverPath ] [-BinaryPath ] [-Switches ] [-Arguments ] [-ProfilePath ] [-LogLevel ] [-UserAgent ] - [] + [-AcceptInsecureCertificates] [] ``` ## DESCRIPTION @@ -38,6 +38,21 @@ Create a Chrome driver option object to perform additional things unsupported di ## PARAMETERS +### -AcceptInsecureCertificates +If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Arguments Command line arguments to be passed to the browser. diff --git a/Help/New-SeScreenshot.md b/Help/New-SeScreenshot.md index ccf34df..d5fd381 100644 --- a/Help/New-SeScreenshot.md +++ b/Help/New-SeScreenshot.md @@ -12,7 +12,7 @@ Take a screenshot of the current page ## SYNTAX -### Path (Default) +### Driver (Default) ``` New-SeScreenshot [-AsBase64EncodedString] [] ``` @@ -34,10 +34,10 @@ Take a screenshot of the current page ### Example 1 ```powershell -PS C:\> New-SeScreenshot -Path 'c:\temp\Screenshot.png' -ImageFormat Png +PS C:\> $Element | New-SeScreenshot ``` -Save a screenshot in PNG format at the specified location +Take a screenshot of the specified element. ## PARAMETERS @@ -57,7 +57,7 @@ Accept wildcard characters: False ``` ### -Element -{{ Fill Element Description }} +Target IWebElement. ```yaml Type: IWebElement @@ -72,7 +72,7 @@ Accept wildcard characters: False ``` ### -InputObject -{{ Fill InputObject Description }} +Target IWebElement. ```yaml Type: Object diff --git a/Help/Start-SeDriver.md b/Help/Start-SeDriver.md index 9481e27..ba58f08 100644 --- a/Help/Start-SeDriver.md +++ b/Help/Start-SeDriver.md @@ -17,7 +17,7 @@ Launch the specified browser. Start-SeDriver [[-StartURL] ] [-State ] [-DefaultDownloadPath ] [-PrivateBrowsing] [-ImplicitWait ] [-Size ] [-Position ] [-WebDriverPath ] [-BinaryPath ] [-Arguments ] [-ProfilePath ] [-LogLevel ] [-Name ] - [-UserAgent ] [] + [-UserAgent ] [-AcceptInsecureCertificates] [] ``` ### DriverOptions @@ -26,7 +26,7 @@ Start-SeDriver [-Browser ] [[-StartURL] ] [-State ] [-PrivateBrowsing] [-ImplicitWait ] [-Size ] [-Position ] [-WebDriverPath ] [-BinaryPath ] [-Service ] -Options [-Arguments ] [-ProfilePath ] [-LogLevel ] - [-Name ] [-UserAgent ] [] + [-Name ] [-UserAgent ] [-AcceptInsecureCertificates] [] ``` ### Default @@ -35,7 +35,7 @@ Start-SeDriver [-Browser ] [[-StartURL] ] [-State ] [-PrivateBrowsing] [-ImplicitWait ] [-Size ] [-Position ] [-WebDriverPath ] [-BinaryPath ] [-Switches ] [-Arguments ] [-ProfilePath ] [-LogLevel ] [-Name ] [-UserAgent ] - [] + [-AcceptInsecureCertificates] [] ``` ## DESCRIPTION @@ -52,6 +52,21 @@ Start a Chrome browser at the specified position and starting URL ## PARAMETERS +### -AcceptInsecureCertificates +If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Arguments Command line arguments to be passed to the browser. diff --git a/Internal/Get-DriverProcessId.ps1 b/Internal/Get-DriverProcessId.ps1 index ffdd7db..49d6b51 100644 --- a/Internal/Get-DriverProcessId.ps1 +++ b/Internal/Get-DriverProcessId.ps1 @@ -8,7 +8,7 @@ function Get-DriverProcessId { if ($IsWindowsPowershell) { $Processes = Get-CimInstance -Class Win32_Process -Filter "ParentProcessId=$ServiceProcessId" - $BrowserProcess = $Processes.Where( { $_.Name -ne 'conhost.exe' }, 'first').ProcessId + $BrowserProcess = $Processes | Where-Object { $_.Name -ne 'conhost.exe' } | Select-Object -First 1 -ExpandProperty ProcessId } else { $BrowserProcess = (Get-Process).Where( { { $_.Parent.id -eq $ServiceProcessId -and $_.Name -ne 'conhost' } }, 'first').Id diff --git a/Internal/Start-SeChromeDriver.ps1 b/Internal/Start-SeChromeDriver.ps1 index aeed245..9daa6a5 100644 --- a/Internal/Start-SeChromeDriver.ps1 +++ b/Internal/Start-SeChromeDriver.ps1 @@ -14,7 +14,8 @@ function Start-SeChromeDriver { [OpenQA.Selenium.DriverOptions]$Options, [String[]]$Switches, [OpenQA.Selenium.LogLevel]$LogLevel, - $UserAgent + $UserAgent, + [Switch]$AcceptInsecureCertificates @@ -52,6 +53,11 @@ function Start-SeChromeDriver { $Options.AddArgument("--user-agent=$UserAgent") } + if ($AcceptInsecureCertificates) { + Write-Verbose "AcceptInsecureCertificates capability set to: $($AcceptInsecureCertificates.IsPresent)" + $Options.AddAdditionalCapability([OpenQA.Selenium.Remote.CapabilityType]::AcceptInsecureCertificates, $true, $true) + } + if ($ProfilePath) { Write-Verbose "Setting Profile directory: $ProfilePath" $Options.AddArgument("user-data-dir=$ProfilePath") diff --git a/Internal/Start-SeEdgeDriver.ps1 b/Internal/Start-SeEdgeDriver.ps1 index 3811ca9..1f25ab5 100644 --- a/Internal/Start-SeEdgeDriver.ps1 +++ b/Internal/Start-SeEdgeDriver.ps1 @@ -14,35 +14,37 @@ function Start-SeEdgeDriver { [OpenQA.Selenium.DriverService]$service, [OpenQA.Selenium.DriverOptions]$Options, [String[]]$Switches, - [OpenQA.Selenium.LogLevel]$LogLevel + [OpenQA.Selenium.LogLevel]$LogLevel, + [Switch]$AcceptInsecureCertificates ) - $OptionSettings = @{ browserName = '' } + + if ($AcceptInsecureCertificates) { + Write-Verbose "AcceptInsecureCertificates capability set to: $($AcceptInsecureCertificates.IsPresent)" + $Options.AddAdditionalCapability([OpenQA.Selenium.Remote.CapabilityType]::AcceptInsecureCertificates, $true, $true) + } + #region check / set paths for browser and web driver and edge options if ($PSBoundParameters['BinaryPath'] -and -not (Test-Path -Path $BinaryPath)) { throw "Could not find $BinaryPath"; return } - if ($PSBoundParameters.ContainsKey('LogLevel')) { - Write-Warning "LogLevel parameter is not implemented for $($Options.SeParams.Browser)" - } - - #Were we given a driver location and is msedgedriver there ? - #If were were given a location (which might be from an environment variable) is the driver THERE ? - # if not, were we given a path for the browser executable, and is the driver THERE ? - # and if not there either, is there one in the assemblies sub dir ? And if not bail if ($WebDriverPath -and -not (Test-Path -Path (Join-Path -Path $WebDriverPath -ChildPath 'msedgedriver.exe'))) { throw "Could not find msedgedriver.exe in $WebDriverPath"; return } elseif ($WebDriverPath -and (Test-Path (Join-Path -Path $WebDriverPath -ChildPath 'msedge.exe'))) { Write-Verbose -Message "Using browser from $WebDriverPath" - $optionsettings['BinaryLocation'] = Join-Path -Path $WebDriverPath -ChildPath 'msedge.exe' + $Options.BinaryLocation = Join-Path -Path $WebDriverPath -ChildPath 'msedge.exe' } elseif ($BinaryPath) { - $optionsettings['BinaryLocation'] = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($BinaryPath) - $binaryDir = Split-Path -Path $BinaryPath -Parent - Write-Verbose -Message "Will request $($OptionSettings['BinaryLocation']) as the browser" + $Options.BinaryLocation = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($BinaryPath) + Write-Verbose -Message "Will request $($Options.BinaryLocation) as the browser" } + + if ($PSBoundParameters.ContainsKey('LogLevel')) { + Write-Warning "LogLevel parameter is not implemented for $($Options.SeParams.Browser)" + } + if (-not $WebDriverPath -and $binaryDir -and (Test-Path (Join-Path -Path $binaryDir -ChildPath 'msedgedriver.exe'))) { $WebDriverPath = $binaryDir } @@ -51,8 +53,6 @@ function Start-SeEdgeDriver { $WebDriverPath = "$PSScriptRoot\Assemblies\" Write-Verbose -Message "Using Web driver from the default location" } - if (-not $WebDriverPath) { throw "Could not find msedgedriver.exe"; return } - if (-not $PSBoundParameters.ContainsKey('Service')) { $ServiceParams = @{} @@ -60,8 +60,6 @@ function Start-SeEdgeDriver { $service = New-SeDriverService -Browser Edge @ServiceParams } - $options = New-Object -TypeName OpenQA.Selenium.Chrome.ChromeOptions -Property $OptionSettings - #The command line args may now be --inprivate --headless but msedge driver V81 does not pass them if ($PrivateBrowsing) { $options.AddArguments('InPrivate') } if ($State -eq [SeWindowState]::Headless) { $options.AddArguments('headless') } diff --git a/Internal/Start-SeFirefoxDriver.ps1 b/Internal/Start-SeFirefoxDriver.ps1 index f3ba92b..29efb52 100644 --- a/Internal/Start-SeFirefoxDriver.ps1 +++ b/Internal/Start-SeFirefoxDriver.ps1 @@ -14,30 +14,34 @@ function Start-SeFirefoxDriver { [OpenQA.Selenium.DriverOptions]$Options, [String[]]$Switches, [OpenQA.Selenium.LogLevel]$LogLevel, - [String]$UserAgent + [String]$UserAgent, + [Switch]$AcceptInsecureCertificates ) process { - #region firefox set-up options - $Firefox_Options = [OpenQA.Selenium.Firefox.FirefoxOptions]::new() if ($State -eq [SeWindowState]::Headless) { - $Firefox_Options.AddArguments('-headless') + $Options.AddArguments('-headless') } if ($DefaultDownloadPath) { Write-Verbose "Setting Default Download directory: $DefaultDownloadPath" - $Firefox_Options.setPreference("browser.download.folderList", 2); - $Firefox_Options.SetPreference("browser.download.dir", "$DefaultDownloadPath"); + $Options.setPreference("browser.download.folderList", 2); + $Options.SetPreference("browser.download.dir", "$DefaultDownloadPath"); } if ($UserAgent) { Write-Verbose "Setting User Agent: $UserAgent" - $Firefox_Options.SetPreference("general.useragent.override", $UserAgent) + $Options.SetPreference("general.useragent.override", $UserAgent) + } + + if ($AcceptInsecureCertificates) { + Write-Verbose "AcceptInsecureCertificates capability set to: $($AcceptInsecureCertificates.IsPresent)" + $Options.AddAdditionalCapability([OpenQA.Selenium.Remote.CapabilityType]::AcceptInsecureCertificates,$true,$true) } if ($PrivateBrowsing) { - $Firefox_Options.SetPreference("browser.privatebrowsing.autostart", $true) + $Options.SetPreference("browser.privatebrowsing.autostart", $true) } if ($PSBoundParameters.ContainsKey('LogLevel')) { @@ -52,7 +56,7 @@ function Start-SeFirefoxDriver { } - $Driver = [OpenQA.Selenium.Firefox.FirefoxDriver]::new($service, $Firefox_Options) + $Driver = [OpenQA.Selenium.Firefox.FirefoxDriver]::new($service, $Options) if (-not $Driver) { Write-Warning "Web driver was not created"; return } Add-Member -InputObject $Driver -MemberType NoteProperty -Name 'SeServiceProcessId' -Value $Service.ProcessID #region post creation options diff --git a/Internal/Start-SeInternetExplorerDriver.ps1 b/Internal/Start-SeInternetExplorerDriver.ps1 index 3ea8fb4..e1be142 100644 --- a/Internal/Start-SeInternetExplorerDriver.ps1 +++ b/Internal/Start-SeInternetExplorerDriver.ps1 @@ -15,17 +15,16 @@ function Start-SeInternetExplorerDriver { [OpenQA.Selenium.LogLevel]$LogLevel ) - $IgnoreProtectedModeSettings = Get-OptionsSwitchValue -Switches $Switches -Name 'IgnoreProtectedModeSettings' + #region IE set-up options if ($state -eq [SeWindowState]::Headless -or $PrivateBrowsing) { Write-Warning 'The Internet explorer driver does not support headless or Inprivate operation; these switches are ignored' } - $InternetExplorer_Options = [OpenQA.Selenium.IE.InternetExplorerOptions]::new() - $InternetExplorer_Options.IgnoreZoomLevel = $true + $IgnoreProtectedModeSettings = Get-OptionsSwitchValue -Switches $Switches -Name 'IgnoreProtectedModeSettings' if ($IgnoreProtectedModeSettings) { - $InternetExplorer_Options.IntroduceInstabilityByIgnoringProtectedModeSettings = $true + $Options.IntroduceInstabilityByIgnoringProtectedModeSettings = $true } - if ($StartURL) { $InternetExplorer_Options.InitialBrowserUrl = $StartURL } + if ($StartURL) { $Options.InitialBrowserUrl = $StartURL } if (-not $PSBoundParameters.ContainsKey('Service')) { $ServiceParams = @{} @@ -35,7 +34,7 @@ function Start-SeInternetExplorerDriver { #endregion - $Driver = [OpenQA.Selenium.IE.InternetExplorerDriver]::new($service, $InternetExplorer_Options) + $Driver = [OpenQA.Selenium.IE.InternetExplorerDriver]::new($service, $Options) if (-not $Driver) { Write-Warning "Web driver was not created"; return } Add-Member -InputObject $Driver -MemberType NoteProperty -Name 'SeServiceProcessId' -Value $Service.ProcessID if ($PSBoundParameters.ContainsKey('LogLevel')) { diff --git a/Internal/Start-SeMSEdgeDriver.ps1 b/Internal/Start-SeMSEdgeDriver.ps1 index f702f58..4354c6a 100644 --- a/Internal/Start-SeMSEdgeDriver.ps1 +++ b/Internal/Start-SeMSEdgeDriver.ps1 @@ -22,11 +22,9 @@ function Start-SeMSEdgeDriver { if (-not $PSBoundParameters.ContainsKey('Service')) { $ServiceParams = @{} #if ($WebDriverPath) { $ServiceParams.Add('WebDriverPath', $WebDriverPath) } - $service = New-SeDriverService -Browser MSEdge @ServiceParams + $service = New-SeDriverService -Browser MSEdge @ServiceParams -ErrorAction Stop } - $options = [OpenQA.Selenium.Edge.EdgeOptions]::new() - if ($PrivateBrowsing) { $options.UseInPrivateBrowsing = $true } if ($StartURL) { $options.StartPage = $StartURL } #endregion diff --git a/Internal/Test-SeDriverAcceptInsecureCertificates.ps1 b/Internal/Test-SeDriverAcceptInsecureCertificates.ps1 new file mode 100644 index 0000000..e7afa8c --- /dev/null +++ b/Internal/Test-SeDriverAcceptInsecureCertificates.ps1 @@ -0,0 +1,18 @@ +function Test-SeDriverAcceptInsecureCertificates { + [CmdletBinding()] + param ( + $Browser, [ref]$AcceptInsecureCertificates, + $Boundparameters + ) + + $SupportedBrowsers = @('Chrome','Edge','Firefox') + if ($Browser -in $SupportedBrowsers) { + return + } + else { + Throw ([System.NotImplementedException]::new(@" +AcceptInsecureCertificates parameter is only supported by the following browser: $($SupportedBrowsers -join ',') +Selected browser: $Browser +"@)) + } +} \ No newline at end of file diff --git a/Internal/init.ps1 b/Internal/init.ps1 index c731370..818fa5a 100644 --- a/Internal/init.ps1 +++ b/Internal/init.ps1 @@ -33,15 +33,24 @@ $Script:SeKeys = [OpenQA.Selenium.Keys] | Get-Member -MemberType Property -Stati [Dictionary[object, Stack[string]]] $Script:SeLocationMap = [Dictionary[object, Stack[string]]]::new() #region Set path to assemblies on Linux and MacOS and Grant Execution permissions on them + +$ScriptRoot = $PSScriptRoot +# This will happens only if we are debugging +if ($ScriptRoot.EndsWith('Internal')){ + $ScriptRoot = Split-Path -Path $ScriptRoot +} + if ($IsLinux) { - $AssembliesPath = "$PSScriptRoot/assemblies/linux" + $AssembliesPath = "$ScriptRoot/assemblies/linux" } elseif ($IsMacOS) { - $AssembliesPath = "$PSScriptRoot/assemblies/macos" + $AssembliesPath = "$ScriptRoot/assemblies/macos" +} else { + $AssembliesPath = "$ScriptRoot\assemblies" } # Grant Execution permission to assemblies on Linux and MacOS -if ($AssembliesPath) { +if ($IsLinux -or $IsMacOS) { # Check if powershell is NOT running as root Get-Item -Path "$AssembliesPath/chromedriver", "$AssembliesPath/geckodriver" | ForEach-Object { if ($IsLinux) { $FileMod = stat -c "%a" $_.FullName } diff --git a/Output/Selenium/ChangeLog.md b/Output/Selenium/ChangeLog.md index 357d16b..2fb00b4 100644 --- a/Output/Selenium/ChangeLog.md +++ b/Output/Selenium/ChangeLog.md @@ -1,5 +1,29 @@ - +# 4.0.0-preview3 (Planned) +## Added / Modified +- Get-SeElementAttribute now return a hashtable instead of a pscustom object when multiple attributes are queried + + + +## Fixes +- Get-SeElement now make use of Get-SeElementAttribute internally to query attributes. +- Get-SeElement error when using filter / attribute +- Update-SeDriver default path typo (#206) +- New-SeScreenshot documentation update (#200) +- Casing issue with Types.ps1xml filename (#203) + +# 4.0.0-preview2 (Prerelease) +## Added / Modified +- Get-SeElement -Filter; Add a new parameter to do additional filtering before returning. This is equivalent to doing a Where afterward but with the Get-SeElement error management logic applied before returning. (#192) +- AcceptInsecureCertificates switch added to Start-SeDriver / New-SeDriverOptions (Supported by: Chrome, Firefox, Edge) (#189) +- Chrome web drivers assemblies updated to latest version + +## Fixes +- Starting Edge browser broken (#188,#195) +- custom driver options, when specified, are not used (#191,#193) +- Processes management internal logic error (#190) +- Get-SeInput not working properly with -Single switch (#186) +- Screenshots fail when attempting to screenshot the page (#187) # 4.0.0-preview1 (Prerelease) Note: V4 have an enormous amount of breakchanges. Most of the cmdlet have been rewriten in a way or another. diff --git a/Output/Selenium/Selenium.psd1 b/Output/Selenium/Selenium.psd1 index 6ed7bf1..27607e9 100644 --- a/Output/Selenium/Selenium.psd1 +++ b/Output/Selenium/Selenium.psd1 @@ -39,7 +39,7 @@ # A URL to an icon representing this module. # IconUri = '' - Prerelease = 'preview1' + Prerelease = 'preview3' } # End of PSData hashtable } # End of PrivateData hashtable diff --git a/Output/Selenium/Selenium.psm1 b/Output/Selenium/Selenium.psm1 index 7e77b7d..6c563b7 100644 Binary files a/Output/Selenium/Selenium.psm1 and b/Output/Selenium/Selenium.psm1 differ diff --git a/Output/Selenium/assemblies/chromedriver.exe b/Output/Selenium/assemblies/chromedriver.exe index c0efae8..14e61bc 100644 Binary files a/Output/Selenium/assemblies/chromedriver.exe and b/Output/Selenium/assemblies/chromedriver.exe differ diff --git a/Output/Selenium/assemblies/chromedriver.exe.sha256 b/Output/Selenium/assemblies/chromedriver.exe.sha256 index c5b4c83..e9f7251 100644 --- a/Output/Selenium/assemblies/chromedriver.exe.sha256 +++ b/Output/Selenium/assemblies/chromedriver.exe.sha256 @@ -1 +1 @@ -5BFEADAEB1182DC068B60377BA34C010317D6AE19DA4934A221B2B1F3A050889 +C6131A3106A8956702459673BDCC7F37BDD8989A141D2CBE15DC0157F0D53C74 diff --git a/Output/Selenium/assemblies/linux/chromedriver b/Output/Selenium/assemblies/linux/chromedriver index ca100fd..68b4075 100644 Binary files a/Output/Selenium/assemblies/linux/chromedriver and b/Output/Selenium/assemblies/linux/chromedriver differ diff --git a/Output/Selenium/assemblies/linux/chromedriver.sha256 b/Output/Selenium/assemblies/linux/chromedriver.sha256 index 14067a4..4eb67e6 100644 --- a/Output/Selenium/assemblies/linux/chromedriver.sha256 +++ b/Output/Selenium/assemblies/linux/chromedriver.sha256 @@ -1 +1 @@ -D933FAA89173AFEC49B945F11360197117CB37AF3CE7EA16545D349B41869687 +01112975217552167F101D7B549D31A12B3C45ABE411892F92228BF8CB2F0058 diff --git a/Output/Selenium/assemblies/macos/chromedriver b/Output/Selenium/assemblies/macos/chromedriver index 7471717..f4bfcc6 100644 Binary files a/Output/Selenium/assemblies/macos/chromedriver and b/Output/Selenium/assemblies/macos/chromedriver differ diff --git a/Output/Selenium/assemblies/macos/chromedriver.sha256 b/Output/Selenium/assemblies/macos/chromedriver.sha256 index 59914ba..27ca9d8 100644 --- a/Output/Selenium/assemblies/macos/chromedriver.sha256 +++ b/Output/Selenium/assemblies/macos/chromedriver.sha256 @@ -1 +1 @@ -9793D91D3448E35061606F37F1EB3EECC7B492CF159E6A318395445FB75B46EC +1DA3E0CBF79A92CF06B08812A39991A37B5C5458DEC2A7B4FFF34F6D87126281 diff --git a/Output/Selenium/en-US/Selenium-help.xml b/Output/Selenium/en-US/Selenium-help.xml index 12043e2..36f73b6 100644 --- a/Output/Selenium/en-US/Selenium-help.xml +++ b/Output/Selenium/en-US/Selenium-help.xml @@ -219,7 +219,7 @@ - {{ Fill in the Description }} + Convert Selenium IDE .side recording file to PowerShell commands. @@ -652,6 +652,18 @@ None + + Filter + + Filter the obtained output with additional conditions. This is equivalent to doing a Where-Object afterward with the benefit of going trough the Get-SeElement error management. + + ScriptBlock + + ScriptBlock + + + None + Single @@ -735,6 +747,18 @@ None + + Filter + + Filter the obtained output with additional conditions. This is equivalent to doing a Where-Object afterward with the benefit of going trough the Get-SeElement error management. + + ScriptBlock + + ScriptBlock + + + None + Single @@ -797,6 +821,18 @@ None + + Filter + + Filter the obtained output with additional conditions. This is equivalent to doing a Where-Object afterward with the benefit of going trough the Get-SeElement error management. + + ScriptBlock + + ScriptBlock + + + None + Single @@ -2378,6 +2414,17 @@ PS C:\> Invoke-SeKeys -Element $Search -Keys 'Powershell-Selenium{{Enter}}' None + + AcceptInsecureCertificates + + If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + + + SwitchParameter + + + False + Arguments @@ -2556,6 +2603,18 @@ PS C:\> Invoke-SeKeys -Element $Search -Keys 'Powershell-Selenium{{Enter}}' + + AcceptInsecureCertificates + + If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + + SwitchParameter + + SwitchParameter + + + False + Arguments @@ -2959,7 +3018,7 @@ PS C:\> $Service.ProcessId Element - {{ Fill Element Description }} + Target IWebElement. IWebElement @@ -2985,7 +3044,7 @@ PS C:\> $Service.ProcessId InputObject - {{ Fill InputObject Description }} + Target IWebElement. Object @@ -3012,7 +3071,7 @@ PS C:\> $Service.ProcessId Element - {{ Fill Element Description }} + Target IWebElement. IWebElement @@ -3024,7 +3083,7 @@ PS C:\> $Service.ProcessId InputObject - {{ Fill InputObject Description }} + Target IWebElement. Object @@ -3062,9 +3121,9 @@ PS C:\> $Service.ProcessId -------------------------- Example 1 -------------------------- - PS C:\> New-SeScreenshot -Path 'c:\temp\Screenshot.png' -ImageFormat Png + PS C:\> $Element | New-SeScreenshot - Save a screenshot in PNG format at the specified location + Take a screenshot of the specified element. @@ -4335,6 +4394,17 @@ PS C:\> Save-SeScreenshot -Screenshot $Screenshot -Path 'c:\temp\image.png' - None + + AcceptInsecureCertificates + + If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + + + SwitchParameter + + + False + Arguments @@ -4556,6 +4626,17 @@ PS C:\> Save-SeScreenshot -Screenshot $Screenshot -Path 'c:\temp\image.png' - None + + AcceptInsecureCertificates + + If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + + + SwitchParameter + + + False + Arguments @@ -4753,6 +4834,18 @@ PS C:\> Save-SeScreenshot -Screenshot $Screenshot -Path 'c:\temp\image.png' - + + AcceptInsecureCertificates + + If set, Ignore SSL certificate error (Chrome,Edge,Firefox) + + SwitchParameter + + SwitchParameter + + + False + Arguments diff --git a/Output/Selenium/formats/Selenium.format.ps1xml b/Output/Selenium/formats/Selenium.format.ps1xml index 0fb5aed..4521c8d 100644 --- a/Output/Selenium/formats/Selenium.format.ps1xml +++ b/Output/Selenium/formats/Selenium.format.ps1xml @@ -119,6 +119,60 @@ + + selenium-powershell/SeInput + + selenium-powershell/SeInput + + + + + + + + + + + + + + + + + + + + + + + + + + Tagname + + + $_.Attributes.type + + + Enabled + + + Displayed + + + Text + + + $_.Attributes.placeholder + + + $_.Attributes.value + + + + + + SeSelectValueInfo diff --git a/Public/ConvertTo-SeSelenium.ps1 b/Public/ConvertTo-SeSelenium.ps1 index 3a3680a..346db40 100644 --- a/Public/ConvertTo-SeSelenium.ps1 +++ b/Public/ConvertTo-SeSelenium.ps1 @@ -1,8 +1,4 @@ function ConvertTo-Selenium { - <# - .SYNOPSIS - Convert Selenium IDE .side recording file to PowerShell commands. - #> [CmdletBinding()] param ( # Path to .side file. diff --git a/Public/Get-SeElement.ps1 b/Public/Get-SeElement.ps1 index 76c27df..24415ef 100644 --- a/Public/Get-SeElement.ps1 +++ b/Public/Get-SeElement.ps1 @@ -17,6 +17,7 @@ function Get-SeElement { [Switch]$All, [ValidateNotNullOrEmpty()] [String[]]$Attributes, + [scriptblock]$Filter, [Switch]$Single ) Begin { @@ -89,45 +90,38 @@ function Get-SeElement { } + $GetAllAttributes = $PSBoundParameters.ContainsKey('Attributes') -and $Attributes.Count -eq 1 -and $Attributes[0] -eq '*' + $MyAttributes = [System.Collections.Generic.List[String]]::new() + if ( $null -ne $Attributes) { $MyAttributes = [System.Collections.Generic.List[String]]$Attributes } + + if (!$GetAllAttributes -and $Filter) { + $AdditionalAttributes = [regex]::Matches($Filter, '\$_\.Attributes.(\w+)', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase) | % { $_.Groups[1].value } + $AdditionalAttributes | ForEach-Object {if (!$MyAttributes.Contains($_)) { $MyAttributes.Add($_) }} + } - if ($PSBoundParameters.ContainsKey('Attributes')) { - $GetAllAttributes = $Attributes.Count -eq 1 -and $Attributes[0] -eq '*' - - if ($GetAllAttributes) { - Foreach ($Item in $Output) { - $AllAttributes = $Driver.ExecuteScript('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', $Item) - $AttArray = [System.Collections.Generic.Dictionary[String, String]]::new() - - Foreach ($AttKey in $AllAttributes.Keys) { - $AttArray.Add($AttKey, $AllAttributes[$AttKey]) - } + if ($MyAttributes.Count -gt 0) { + Foreach ($Item in $Output) { + $htAttributes = Get-SeElementAttribute -Element $Item -Name $MyAttributes + if ($htAttributes -is [String]) {$htAttributes = @{$MyAttributes[0] = $htAttributes }} + Add-Member -InputObject $Item -Name 'Attributes' -Value $htAttributes -MemberType NoteProperty + } + } - Add-Member -InputObject $Item -Name 'Attributes' -Value $AttArray -MemberType NoteProperty - } - } - else { - foreach ($Item in $Output) { - $AttArray = [System.Collections.Generic.Dictionary[String, String]]::new() - - foreach ($att in $Attributes) { - $Value = $Item.GetAttribute($att) - if ($Value -ne "") { - $AttArray.Add($att, $Item.GetAttribute($att)) - } - - } - Add-Member -InputObject $Item -Name 'Attributes' -Value $AttArray -MemberType NoteProperty - } - } - + # Apply filter here + $AndFilterstr = "" + if ($Filter) { + $AndFilterstr = " and the applied filter" + $Output = $Output | Where-Object $Filter } + + if ($null -eq $Output) { - $Message = "no such element: Unable to locate element by: $($By -join ',') with value $($Value -join ',')" + $Message = "no such element: Unable to locate element by: $($By -join ',') with value $($Value -join ',')$AndFilterstr" Write-Error -Exception ([System.Management.Automation.ItemNotFoundException]::new($Message)) return } elseif ($PSBoundParameters.ContainsKey('Single') -and $Single -eq $true -and $Output.count -gt 1) { - $Message = "A single element was expected but $($Output.count) elements were found using the locator $($By -join ',') with value $($Value -join ',')." + $Message = "A single element was expected but $($Output.count) elements were found using the locator $($By -join ',') with value $($Value -join ',')$AndFilterstr." Write-Error -Exception ([System.InvalidOperationException]::new($Message)) return } diff --git a/Public/Get-SeElementAttribute.ps1 b/Public/Get-SeElementAttribute.ps1 index 6d35003..800b92e 100644 --- a/Public/Get-SeElementAttribute.ps1 +++ b/Public/Get-SeElementAttribute.ps1 @@ -23,7 +23,7 @@ function Get-SeElementAttribute { $Output.$Att = $value } } - [PSCustomObject]$Output + $Output } elseif ($ManyAttributes) { $Output = @{} @@ -33,7 +33,7 @@ function Get-SeElementAttribute { $Output.$Att = $value } } - [PSCustomObject]$Output + $Output } else { $Element.GetAttribute($Name) diff --git a/Public/Get-SeInput.ps1 b/Public/Get-SeInput.ps1 index af2490e..1a861ea 100644 --- a/Public/Get-SeInput.ps1 +++ b/Public/Get-SeInput.ps1 @@ -16,33 +16,39 @@ function Get-SeInput { $Driver = Init-SeDriver -ErrorAction Stop } Process { - $MyAttributes = @{} + $MyAttributes = @{Attributes = [System.Collections.Generic.List[String]]::new()} $SelectedAttribute = "" - Filter ConditionFilter($Type, $Text, $Value, $Attribute) { - if ("" -ne $Type) { if ($_.Attributes.type -ne $type) { return } } - if ("" -ne $Text) { if ($_.Text -ne $Text ) { return } } - if ("" -ne $Value -and "" -ne $Attribute) { if ($_.Attributes.$Attribute -ne $Value ) { return } } - $_ - } + $LoadAllAttributes = $false if ($PSBoundParameters.Remove('Attributes')) { $MyAttributes = @{Attributes = [System.Collections.Generic.List[String]]$Attributes } + $LoadAllAttributes = $Attributes.Count -eq 1 -and $Attributes[0] -eq '*' if ($Attributes[0] -ne '*') { $SelectedAttribute = $MyAttributes.Attributes[0] } } - if ($PSBoundParameters.Remove('Type')) { - if ($null -eq $Attributes) { - $MyAttributes = @{Attributes = 'type' } - } - else { - if (-not $Attributes.contains('type') -and -not $Attributes.contains('*')) { - $MyAttributes.Attributes.add('type') - } - } - + if (!$LoadAllAttributes){ + if ($PSBoundParameters.Remove('Type')) { + if (-not $MyAttributes.Attributes.Contains('type')) { $MyAttributes.Attributes.add('type') } + } + if (-not $MyAttributes.Attributes.Contains('placeholder')) { $MyAttributes.Attributes.add('placeholder') } + if (-not $MyAttributes.Attributes.Contains('value')) { $MyAttributes.Attributes.add('value') } } + + [void]($PSBoundParameters.Remove('Value')) - Get-SeElement -By TagName -Value input @PSBoundParameters @MyAttributes | ConditionFilter -Type $Type -Text $Text -Value $Value -Attribute $SelectedAttribute + + $Filter = [scriptblock]::Create(@" + if ("" -ne "$Type") { if (`$_.Attributes.type -ne "$type") { return } } + if ("" -ne "$Text") { if (`$_.Text -ne "$Text" ) { return } } + if ("" -ne "$Value" -and "" -ne "$SelectedAttribute") { if (`$_.Attributes."$SelectedAttribute" -ne "$Value" ) { return } } + `$_ +"@) + + Get-SeElement -By TagName -Value input @PSBoundParameters @MyAttributes -Filter $Filter | ForEach-Object { + $_.Psobject.TypeNames.Insert(0, 'selenium-powershell/SeInput') + $_ + } + } } diff --git a/Public/New-SeDriverOptions.ps1 b/Public/New-SeDriverOptions.ps1 index 6ed368f..fb6c417 100644 --- a/Public/New-SeDriverOptions.ps1 +++ b/Public/New-SeDriverOptions.ps1 @@ -32,16 +32,22 @@ function New-SeDriverOptions { [SeDriverUserAgentTransformAttribute()] [ValidateNotNull()] [ArgumentCompleter( [SeDriverUserAgentCompleter])] - [String]$UserAgent + [String]$UserAgent, + [Switch]$AcceptInsecureCertificates ) if ($PSBoundParameters.ContainsKey('UserAgent')) { Test-SeDriverUserAgent -Browser $Browser -ErrorAction Stop } + if ($PSBoundParameters.ContainsKey('AcceptInsecureCertificates')) { Test-SeDriverAcceptInsecureCertificates -Browser $Browser -ErrorAction Stop } + # [Enum]::GetNames([sebrowsers]) $output = $null switch ($Browser) { Chrome { $Output = [OpenQA.Selenium.Chrome.ChromeOptions]::new() } - Edge { $Output = [OpenQA.Selenium.Edge.EdgeOptions]::new() } + Edge { $Output = New-Object -TypeName OpenQA.Selenium.Chrome.ChromeOptions -Property @{ browserName = '' } } Firefox { $Output = [OpenQA.Selenium.Firefox.FirefoxOptions]::new() } - InternetExplorer { $Output = [OpenQA.Selenium.IE.InternetExplorerOptions]::new() } + InternetExplorer { + $Output = [OpenQA.Selenium.IE.InternetExplorerOptions]::new() + $Output.IgnoreZoomLevel = $true + } MSEdge { $Output = [OpenQA.Selenium.Edge.EdgeOptions]::new() } } diff --git a/Public/New-SeDriverService.ps1 b/Public/New-SeDriverService.ps1 index aec87cb..695700a 100644 --- a/Public/New-SeDriverService.ps1 +++ b/Public/New-SeDriverService.ps1 @@ -27,7 +27,7 @@ function New-SeDriverService { else { $service = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService() } } Edge { - $service = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($WebDriverPath, 'msedgedriver.exe') + $service = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ServicePath, 'msedgedriver.exe') } Firefox { if ($ServicePath) { $service = [OpenQA.Selenium.Firefox.FirefoxDriverService]::CreateDefaultService($ServicePath) } diff --git a/Public/New-SeScreenshot.ps1 b/Public/New-SeScreenshot.ps1 index 31bdc2d..8879b1c 100644 --- a/Public/New-SeScreenshot.ps1 +++ b/Public/New-SeScreenshot.ps1 @@ -1,6 +1,6 @@ function New-SeScreenshot { - [cmdletbinding(DefaultParameterSetName = 'Path')] + [cmdletbinding(DefaultParameterSetName = 'Driver')] param( [Parameter(DontShow, ValueFromPipeline = $true, ParameterSetName = 'Pipeline')] [ValidateScript( { diff --git a/Public/Save-SeScreenshot.ps1 b/Public/Save-SeScreenshot.ps1 index 3a532d9..6078468 100644 --- a/Public/Save-SeScreenshot.ps1 +++ b/Public/Save-SeScreenshot.ps1 @@ -34,7 +34,7 @@ function Save-SeScreenshot { { $_ -is [OpenQA.Selenium.Screenshot] } { $Screenshot = $InputObject } } } - 'Driver' { $Screenshot = New-SeScreenshot -Driver $Driver } + 'Driver' { $Screenshot = New-SeScreenshot } 'Element' { $Screenshot = New-SeScreenshot -Element $Element } } diff --git a/Public/Start-SeDriver.ps1 b/Public/Start-SeDriver.ps1 index 0e371e4..960e615 100644 --- a/Public/Start-SeDriver.ps1 +++ b/Public/Start-SeDriver.ps1 @@ -37,11 +37,13 @@ function Start-SeDriver { [SeDriverUserAgentTransformAttribute()] [ValidateNotNull()] [ArgumentCompleter( [SeDriverUserAgentCompleter])] - [String]$UserAgent + [String]$UserAgent, + [Switch]$AcceptInsecureCertificates # See ParametersToRemove to view parameters that should not be passed to browsers internal implementations. ) Begin { if ($PSBoundParameters.ContainsKey('UserAgent')) { Test-SeDriverUserAgent -Browser $Browser -ErrorAction Stop } + if ($PSBoundParameters.ContainsKey('AcceptInsecureCertificates')) { Test-SeDriverAcceptInsecureCertificates -Browser $Browser -ErrorAction Stop } } process { #Params with default value that need to be pased down to Start-SeXXDriver @@ -108,7 +110,7 @@ function Start-SeDriver { switch ($SelectedBrowser) { 'Chrome' { $Driver = Start-SeChromeDriver @PSBoundParameters; break } - 'Edge' { $Driver = Start-EdgeDriver @PSBoundParameters; break } + 'Edge' { $Driver = Start-SeEdgeDriver @PSBoundParameters; break } 'Firefox' { $Driver = Start-SeFirefoxDriver @PSBoundParameters; break } 'InternetExplorer' { $Driver = Start-SeInternetExplorerDriver @PSBoundParameters; break } 'MSEdge' { $Driver = Start-SeMSEdgeDriver @PSBoundParameters; break } diff --git a/Public/Update-SeDriver.ps1 b/Public/Update-SeDriver.ps1 index 4361bfc..f6b5ab5 100644 --- a/Public/Update-SeDriver.ps1 +++ b/Public/Update-SeDriver.ps1 @@ -18,9 +18,9 @@ function Update-SeDriver { $Path = $PSScriptRoot if ($Path.EndsWith('Public')) { $Path = Split-Path -Path $Path } #Debugging switch ($OS) { - 'Linux' { $AssembliesDir = Join-Path -Path $Path -ChildPath '/assembiles/linux' } - 'Mac' { $AssembliesDir = Join-Path -Path $Path -ChildPath '/assembiles/macos' } - 'Windows' { $AssembliesDir = Join-Path -Path $Path -ChildPath '/assembiles' } + 'Linux' { $AssembliesDir = Join-Path -Path $Path -ChildPath '/assemblies/linux' } + 'Mac' { $AssembliesDir = Join-Path -Path $Path -ChildPath '/assemblies/macos' } + 'Windows' { $AssembliesDir = Join-Path -Path $Path -ChildPath '/assemblies' } } } @@ -59,9 +59,4 @@ function Update-SeDriver { Write-Warning 'Not Supported Yet' } } - - - - - -} \ No newline at end of file +} diff --git a/Selenium.EzFormat.ps1 b/Selenium.EzFormat.ps1 index 7a614fe..442e3c8 100644 --- a/Selenium.EzFormat.ps1 +++ b/Selenium.EzFormat.ps1 @@ -7,7 +7,7 @@ Push-Location $myRoot $Type = @{TypeName = 'OpenQA.Selenium.Remote.RemoteWebElement' } $Typed = @{TypeName = 'OpenQA.Selenium.Remote.RemoteWebDriver' } $formatting = @( - Write-FormatView @type -Property Tagname, Enabled, Displayed, Text -Width 7, 7, 9, 80 -AlignProperty @{Text = 'Left' } -VirtualProperty @{'Hello' = { 'World' } } + Write-FormatView @type -Property Tagname, Enabled, Displayed, Text -Width 7, 7, 9, 80 -AlignProperty @{Text = 'Left' } Write-FormatView @type -AsList -Property Tagname, Text, Enabled, Selected, Location, Size, Displayed Write-FormatView -TypeName 'selenium-powershell/SeFrame' -Property 'TagName', 'Enabled', 'Name', 'Id' -VirtualProperty @{ @@ -15,6 +15,11 @@ $formatting = @( Id = { $_.Attributes.id } } + Write-FormatView -TypeName 'selenium-powershell/SeInput' -Property 'Tagname','Type*','Enabled','Displayed','Text','Placeholder*','Value*' -VirtualProperty @{ + 'Type*' = {$_.Attributes.type} + 'Placeholder*' = {$_.Attributes.placeholder} + 'Value*' = {$_.Attributes.value} + } # Add your own Write-FormatView here, diff --git a/Selenium.psd1 b/Selenium.psd1 index 91f805f..dcaa88a 100644 --- a/Selenium.psd1 +++ b/Selenium.psd1 @@ -39,7 +39,7 @@ # A URL to an icon representing this module. # IconUri = '' - Prerelease = 'preview1' + Prerelease = 'preview3' } # End of PSData hashtable } # End of PrivateData hashtable diff --git a/assemblies/chromedriver.exe b/assemblies/chromedriver.exe index c0efae8..14e61bc 100644 Binary files a/assemblies/chromedriver.exe and b/assemblies/chromedriver.exe differ diff --git a/assemblies/chromedriver.exe.sha256 b/assemblies/chromedriver.exe.sha256 index c5b4c83..e9f7251 100644 --- a/assemblies/chromedriver.exe.sha256 +++ b/assemblies/chromedriver.exe.sha256 @@ -1 +1 @@ -5BFEADAEB1182DC068B60377BA34C010317D6AE19DA4934A221B2B1F3A050889 +C6131A3106A8956702459673BDCC7F37BDD8989A141D2CBE15DC0157F0D53C74 diff --git a/assemblies/linux/chromedriver b/assemblies/linux/chromedriver index ca100fd..68b4075 100755 Binary files a/assemblies/linux/chromedriver and b/assemblies/linux/chromedriver differ diff --git a/assemblies/linux/chromedriver.sha256 b/assemblies/linux/chromedriver.sha256 index 14067a4..4eb67e6 100644 --- a/assemblies/linux/chromedriver.sha256 +++ b/assemblies/linux/chromedriver.sha256 @@ -1 +1 @@ -D933FAA89173AFEC49B945F11360197117CB37AF3CE7EA16545D349B41869687 +01112975217552167F101D7B549D31A12B3C45ABE411892F92228BF8CB2F0058 diff --git a/assemblies/macos/chromedriver b/assemblies/macos/chromedriver index 7471717..f4bfcc6 100644 Binary files a/assemblies/macos/chromedriver and b/assemblies/macos/chromedriver differ diff --git a/assemblies/macos/chromedriver.sha256 b/assemblies/macos/chromedriver.sha256 index 59914ba..27ca9d8 100644 --- a/assemblies/macos/chromedriver.sha256 +++ b/assemblies/macos/chromedriver.sha256 @@ -1 +1 @@ -9793D91D3448E35061606F37F1EB3EECC7B492CF159E6A318395445FB75B46EC +1DA3E0CBF79A92CF06B08812A39991A37B5C5458DEC2A7B4FFF34F6D87126281 diff --git a/formats/Selenium.format.ps1xml b/formats/Selenium.format.ps1xml index 0fb5aed..4521c8d 100644 --- a/formats/Selenium.format.ps1xml +++ b/formats/Selenium.format.ps1xml @@ -119,6 +119,60 @@ + + selenium-powershell/SeInput + + selenium-powershell/SeInput + + + + + + + + + + + + + + + + + + + + + + + + + + Tagname + + + $_.Attributes.type + + + Enabled + + + Displayed + + + Text + + + $_.Attributes.placeholder + + + $_.Attributes.value + + + + + + SeSelectValueInfo