You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:55:02