Powershell调用Edge WebDriver的FindElementByXPath方法报错求助
问题描述
需通过PowerShell结合Edge浏览器自动化操作内部网站:完成登录流程后点击两个按钮进行导航。原本脚本可正常运行,修改后出现方法找不到的错误,已尝试修改代码、删除相关文件、重启电脑等操作,问题仍未解决。
错误信息
Error calling method because [OpenQA.Selenium.Edge.EdgeDriver] does not contain a method named "FindElementByXPath".
In //PATH
$browser.FindElementByXPath('/html/body/div[4]/center/table/tbody/tr/ ...
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : MethodNotFound
原脚本代码
function Create-Browser { param( [Parameter(mandatory=$false)][ValidateSet('Chrome','Edge','Firefox')][string]$browser, [Parameter(mandatory=$false)][bool]$HideCommandPrompt = $true, [Parameter(mandatory=$false)][string]$driverversion = '' ) $driver = $null function Load-NugetAssembly { [CmdletBinding()] param( [string]$url, [string]$name, [string]$zipinternalpath, [switch]$downloadonly ) if($psscriptroot -ne ''){ $localpath = join-path $psscriptroot $name }else{ $localpath = join-path $env:TEMP $name } $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())" $zip = $null try{ if(!(Test-Path $localpath)){ Add-Type -A System.IO.Compression.FileSystem write-host "Downloading and extracting required library '$name' ... " -F Green -NoNewline (New-Object System.Net.WebClient).DownloadFile($url, $tmp) $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp) $zip.Entries | ?{$_.Fullname -eq $zipinternalpath} | %{ [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath) } Unblock-File -Path $localpath write-host "OK" -F Green } if(!$downloadonly.IsPresent){ Add-Type -LiteralPath $localpath -EA Stop } }catch{ throw "Error: $($_.Exception.Message)" }finally{ if ($zip){$zip.Dispose()} if(Test-Path $tmp){del $tmp -Force -EA 0} } } # Load Selenium Webdriver .NET Assembly Load-NugetAssembly 'https://www.nuget.org/api/v2/package/Selenium.WebDriver' -name 'WebDriver.dll' -zipinternalpath 'lib/net45/WebDriver.dll' -EA Stop if($psscriptroot -ne ''){ $driverpath = $psscriptroot + '\' }else{ $driverpath = $env:TEMP } Load-NugetAssembly "https://www.nuget.org/api/v2/package/Selenium.WebDriver.MSEdgeDriver/$driverversion" -name 'msedgedriver.exe' -zipinternalpath 'driver/win64/msedgedriver.exe' -downloadonly -EA Stop #msedge driver laden # create driver service $dService = [OpenQA.Selenium.Edge.EdgeDriverService]::CreateDefaultService($driverpath) # hide command prompt window $dService.HideCommandPromptWindow = $HideCommandPrompt # create driver object $driver = New-Object OpenQA.Selenium.Edge.EdgeDriver $dService return $driver } $browser= Create-Browser $browser.Manage().Window.Maximize() $browser.Navigate().GotoURL("//INTERNAL URL") $browser.FindElementByXPath('/html/body/div[4]/center/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/form/table/tbody/tr[1]/td/input').SendKeys('//USER') $browser.FindElementByXPath('/html/body/div[4]/center/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/form/table/tbody/tr[2]/td/input').SendKeys('PASSWORD') $browser.FindElementByXPath('/html/body/div[4]/center/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/form/table/tbody/tr[3]/td/input').Click() Start-Sleep 1 $browser.FindElementByXPath('/html/body/div[1]/ul[1]/li[4]/a').Click() $browser.FindElementByXPath('/html/body/div[4]/table/tbody/tr[19]/td[2]/a').Click() $browser.quit()
解决方案
错误原因是Selenium 4.x版本移除了FindElementByXPath这类快捷方法,需改用标准的FindElement结合By.XPath定位器的写法。同时修正URL格式问题,修改后的脚本如下:
function Create-Browser { param( [Parameter(mandatory=$false)][ValidateSet('Chrome','Edge','Firefox')][string]$browser, [Parameter(mandatory=$false)][bool]$HideCommandPrompt = $true, [Parameter(mandatory=$false)][string]$driverversion = '' ) $driver = $null function Load-NugetAssembly { [CmdletBinding()] param( [string]$url, [string]$name, [string]$zipinternalpath, [switch]$downloadonly ) if($psscriptroot -ne ''){ $localpath = join-path $psscriptroot $name }else{ $localpath = join-path $env:TEMP $name } $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())" $zip = $null try{ if(!(Test-Path $localpath)){ Add-Type -A System.IO.Compression.FileSystem write-host "Downloading and extracting required library '$name' ... " -F Green -NoNewline (New-Object System.Net.WebClient).DownloadFile($url, $tmp) $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp) $zip.Entries | ?{$_.Fullname -eq $zipinternalpath} | %{ [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath) } Unblock-File -Path $localpath write-host "OK" -F Green } if(!$downloadonly.IsPresent){ Add-Type -LiteralPath $localpath -EA Stop } }catch{ throw "Error: $($_.Exception.Message)" }finally{ if ($zip){$zip.Dispose()} if(Test-Path $tmp){del $tmp -Force -EA 0} } } # Load Selenium Webdriver .NET Assembly Load-NugetAssembly 'https://www.nuget.org/api/v2/package/Selenium.WebDriver' -name 'WebDriver.dll' -zipinternalpath 'lib/net45/WebDriver.dll' -EA Stop if($psscriptroot -ne ''){ $driverpath = $psscriptroot + '\' }else{ $driverpath = $env:TEMP } Load-NugetAssembly "https://www.nuget.org/api/v2/package/Selenium.WebDriver.MSEdgeDriver/$driverversion" -name 'msedgedriver.exe' -zipinternalpath 'driver/win64/msedgedriver.exe' -downloadonly -EA Stop #msedge driver laden # create driver service $dService = [OpenQA.Selenium.Edge.EdgeDriverService]::CreateDefaultService($driverpath) # hide command prompt window $dService.HideCommandPromptWindow = $HideCommandPrompt # create driver object $driver = New-Object OpenQA.Selenium.Edge.EdgeDriver $dService return $driver } $browser= Create-Browser $browser.Manage().Window.Maximize() # 修正URL格式,需以http://或https://开头 $browser.Navigate().GotoURL("https://INTERNAL URL") # 替换所有FindElementByXPath为标准写法 $browser.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[4]/center/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/form/table/tbody/tr[1]/td/input')).SendKeys('USERNAME') $browser.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[4]/center/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/form/table/tbody/tr[2]/td/input')).SendKeys('PASSWORD') $browser.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[4]/center/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/form/table/tbody/tr[3]/td/input')).Click() Start-Sleep 1 $browser.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[1]/ul[1]/li[4]/a')).Click() $browser.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[4]/table/tbody/tr[19]/td[2]/a')).Click() $browser.Quit()
额外注意事项:
- 务必将
https://INTERNAL URL替换为实际的完整网站地址 - 若仍存在版本兼容问题,可指定Selenium.WebDriver的具体版本(比如在Load-NugetAssembly的URL后添加版本号,如
https://www.nuget.org/api/v2/package/Selenium.WebDriver/3.141.0),同时匹配对应的EdgeDriver版本,避免版本不匹配导致的问题
内容的提问来源于stack exchange,提问作者Matthias Wolf
相关产品推荐
相关产品推荐

