Skip to main content
 首页 » 编程设计

c#之使用 html agility xpath 查找 webdriver 元素

2024年01月12日28leader

我正在使用 htmlagility pack 通过表格在大循环中定位元素,因为它比使用通过 webdriver 提供的 native 方法快得多。

通过循环定位特定元素后,我得到它的 xpath,然后将其提供给 webdriver 以返回一个元素。

但是我得到了一个异常(exception);

OpenQA.Selenium.NoSuchElementException: FindElementByXPath.

//html[1]//body[1]//mpns:multipage[1]//mpns:pageview[1]//table[1]// 
 
[Test] 
[Browser(BrowserType.IE)] 
public void Simple_HtmlAgility_Xpath() 
{ 
    Browser.GoTo("http://test/"); 
    Browser.Login().Login_Admin(); 
 
    using (Browser.SwitchToFrame("main")) 
    { 
        var html = new HtmlAgilityPack.HtmlDocument(); 
        html.LoadHtml(Browser.PageSource); 
        var node = html.DocumentNode.SelectSingleNode("//table[@id='testtable']"); 
        var xpath = node.XPath.Replace("/", "//"); 
        Log.Debug(xpath); 
        var element = Browser.FindElement(By.XPath(xpath)); 
        Log.Debug(element.Text); 
    } 
} 

页面示例;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML> 
    <HEAD> 
        <title>Welcome</title>         
    </HEAD> 
    <body> 
        <?XML:NAMESPACE PREFIX="MPNS" /><?IMPORT NAMESPACE="MPNS" IMPLEMENTATION="/webctrl_client/1_0/multipage.htc" /> 
      <MPNS:MultiPage id="test1"> 
       <MPNS:PageView>         
        <table width="100%" id="testtable"> 
            <tr> 
                <td>TEST</td> 
            </tr> 
        </table>                             
       </MPNS:PageView> 
      </MPNS:MultiPage> 
    </body> 
</HTML> 

请您参考如下方法:

似乎 Xpath 无法引用 mpns 命名空间,您需要在 XPath 查询中定义它。请看this一些细节