我什么时候应该使用 XPath?

4
考虑以下示例,其中已知一个
    元素的id,并且我们希望在等于某个文本时单击其包含的
  • 元素。下面是两种解决此问题的方法:

    方法1: 使用XPath

    ReadOnlyCollection<IWebElement> lis = FindElements(By.XPath("//ul[@id='id goes here']/li"));
    foreach (IWebElement li in lis) {
        if (li.Text == text) {
            li.Click();
            break;
        }
    }
    

    方法2: 使用ID和TagName

    IWebElement ul = FindElement(By.Id("id goes here"));
    ReadOnlyCollection<IWebElement> lis = ul.FindElements(By.TagName("li"));
    foreach (IWebElement li in lis) {
        if (li.Text == text) {
            li.Click();
            break;
        }
    }
    

    我的问题是:什么时候应该使用XPath,什么时候不应该使用?

    我更喜欢只在必要时使用XPath。对于这个特定的例子,我认为XPath完全不必要,但当我在StackOverflow上查找这个特定的问题时,似乎大多数用户都默认使用XPath。


1
使用您最熟悉的工具!请阅读最近在此处进行的讨论:https://dev59.com/d1sW5IYBdhLWcg3w2aOK - SiKing
2个回答

3
在这种情况下,XPath甚至可以将问题简化为一行代码:
driver.FindElement(By.XPath(String.Format("//ul[@id='id goes here']/li[. = '{0}']", text))).click();

总的来说,如果您可以使用简单的By.IdBy.TagName或其他类似的“简单”定位器唯一地标识一个元素,请这样做。XPath表达式和基于CSS选择器的定位器通常提供高级定位元素的方法(我们可以在树中向上/向下/侧向移动,使用部分属性匹配,计算元素数量,确定它们的位置等),或者使元素的位置简明扼要,在特定情况下使用。


0
  1. 当您需要跟踪更多类似的网页元素时,请使用XPATH。
  2. 当您需要特定的单个元素时,请使用id。

XPATH具有更多优势,因为有时ID会重复。这是我的经验!


1
但如果ID重复了,那就是需要修复的错误。在HTML页面中,ID需要是唯一的。 - Striter Alfa
id是唯一的,没问题。想象一下,你正在处理第三方网站,这里介绍如何在没有XPath的情况下解决重复id问题。 - Bilal Usean
即使在Jquery中,您也不能使用#选择重复的ID。因此,如果您作为第三方网站的测试人员工作,那么您的职责就是将其标记为错误:代码错误和导航错误。但是,如果您真的想忽略重复的ID,则可以使用xpath。同样,您可以使用快速修复程序进行编程,但是没有人会喜欢支持您的代码,并且几个月后这样做会很困难。 - Striter Alfa
我知道并接受。内部项目最好使用您自己的测试,而在测试第三方时,XPath 最好。(我们根据情况选择选择器) - Bilal Usean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接