在 Selenium 中的许多 findElement(s)/By 函数中,您什么时候会使用一个函数而不是另一个函数?

Of the many findElement(s)/By functions in Selenium, when would you use one over the other?

提问人:Matt I 提问时间:1/2/2018 最后编辑:undetected SeleniumMatt I 更新时间:1/17/2023 访问量:4357

问:

Selenium 包括 findElement 函数,如下所示......

.find_element_by_

id
link_text
partial_link_text
name
class_name
tag_name
css_selector
xpath

很明显,由于 HTML 页面的创建方式,有些标签受到设计限制,例如 id、link_text、name tag_name,因为并非所有标签都可能包含 id、link_text 等......然而,css_selector 和 xpath 几乎可以做这些可以做的所有事情,然后是一些,但似乎在它们可以交互的内容上受到限制。例如,某些按钮可能无法使用 xpath 单击,但可以被css_selector单击。

所以我想知道,什么时候会想使用一个而不是另一个(特别是 xpath 或 css_selector)?

其他函数(id、link_text 等)是否几乎没有用,因为(至少)我发现 xpath/css_selector 也可以做到这一点?

比方说,link_text,使用 xpath/css_selector有什么好处吗?

python-3.x selenium selenium-webdriver css-选择器

评论

0赞 scorpion35 1/2/2018
我使用该函数,无论哪个功能都能为我提供元素的唯一定位器!您可能想看看此页面 - elementalselenium.com/tips/32-xpath-vs-css,为您提供性能统计信息。
0赞 alecxe 1/2/2018
这个讨论可能与此相关:什么是好的硒定位器?
1赞 mrfreester 1/2/2018
我几乎只在我需要通过文本查找某些内容时才使用 xpaths,或者如果找到我想要的元素的唯一方法是找到另一个元素,将 dom 树遍历回某个共享元素,然后回到我想要的元素。根据我的经验,css 选择器最终会更干净、更易于阅读。你会发现有人认为 xpath 也比较慢,但实际上你可能不会注意到其中的区别。
1赞 scorpion35 1/2/2018
@Matt 是的,大多数情况下它们都是独一无二的。如果我看到 id,我使用 findelementbyid;如果缺少,我使用 xpath/CSS 选择器。但是,我确实对findelementbyclass有信任问题,因为类名可以在多个地方使用。我一开始不担心性能,会选择简单的路径。如果性能不好,我才会考虑优化。希望对你有所帮助!
1赞 mrfreester 1/3/2018
@MattI假设你有一堆外观相似的行,其中都有一些你想点击的按钮。无法直接唯一地获取所需的按钮,因为所有行都具有具有相似属性的相似按钮。但是,行中还有一些其他元素是唯一的。所以我可以得到那个元素,遍历 dom 树以获得包含它的行,然后返回使用 xpath 获取按钮。

答:

5赞 undetected Selenium 1/2/2018 #1

这个问题已经在许多论坛上以不同的形式提出和回答。考虑到所有这些,如果我们优先考虑定位器,列表将如下:

  • id:选择具有指定属性的元素。id
  • name:选择具有指定属性的第一个元素。name
  • link_text:选择包含与指定 .LinkText
  • partial_link_text:选择包含与指定 .PartialLinkText
  • tag_name:使用 .Tag Name
  • class_name:使用 .ClassName
  • css_selector:使用 选择元素。CssSelectors
  • xpath:使用表达式查找元素。XPath

所以现在的问题是什么是新的

答案是硒最近发展了很多WebDriver 现在是 W3C 推荐候选者。内部的事情变化得非常快。这不仅仅是选择定位器。我们需要使用一个定位器,它将:Selenium

  • 唯一标识元素
  • 必须优化定位器的性能。

牢记这两个因素,最好的策略是模拟 DOMW3C 推荐候选者确实提到了定位器列表,如下所示:

Selenium_Locators

所以判决是清晰简洁的。

评论

1赞 Matt I 1/2/2018
显然你没有正确阅读我的问题。我知道这些函数的作用,但我想知道为什么人们会选择一个而不是另一个。是否存在 xpath 比 css_selector 更有益于使用的情况,反之亦然。
1赞 undetected Selenium 1/2/2018
你肯定没有逐字逐句地阅读我的全部内容,否则你不会错过我提到的那一行AnswerThe performance of the locator must be optimized.
1赞 Matt I 1/2/2018
我确实读过它,但那行没有具体说明任何内容。您所做的只是发布每个标签的作用以及一些几乎无法进入我正在寻找的信息。这个怎么样。当您转到网页并检查 HTML 文档时,您希望在何时使用 xpath 而不是 css_selector,反之亦然?在单击我非常希望单击的元素方面,一个是否比另一个更稳定?
2赞 undetected Selenium 1/2/2018
稳定性取决于您编写自动化代码的效率,我在我的回答中详细介绍了这一点。为了实现最佳性能,我确实为您提供了从 .但是,容易受到 DOM 更改的影响。如果这回答了您的问题,请告诉我。cssxpathW3C recommendationcssxpath
8赞 Robbie Wareham 1/3/2018 #2

根据我的经验,CSS 是首选的选择器,因为它可以简洁明了,有据可查,并且 Web 开发人员可能有更多的经验和接触。

idnametag_nameclass_name 都可以通过简单的 CSS 轻松复制,所以我会避免显式使用它们。

例如:

编号 ;#my_id

名称;[名称=“my_name”]

tag_name;my_tag

class_name;.my_class

XPath 的使用经常受到诽谤;标记为缓慢且不稳定。但是,我不同意这种观点。

当我采访人们时,当他们说他们避免使用Xpath时,我感到畏缩,因为它又慢又脆。速度不再是问题,xpath 只和写它的人一样脆弱。但是,我更喜欢 CSS 选择器的语法,这就是为什么我会在大多数用例中选择 XPath 的原因。

在 3 种情况下,XPath 是更好的选择;

  • 多个 CSS 选择器可以替换为一个 XPath 查询(例如,find 元素,然后可以在一个 xpath 中执行子元素迭代)

  • XPath 可以根据文本进行选择,而 CSS 选择器则不能

  • XPath 允许你走上 DOM 树,如果你只能通过它的子控件来识别它,这将非常有用

如果可能的话,我总是避免按文本进行选择,但如果我必须这样做,我更愿意使用 XPath 而不是内置的 Link Text 和 Partial Link Text 方法,因为 Xpath 查询将允许我更具表现力,并允许我选择的不仅仅是锚标记。

最后,在使用 XPath 时,“class”被视为文本字符串,而不是 CSS 选择器中支持的类名数组;

HTML: <div class="ab cd">

CSS matches: div.ab
CSS matches: div.cd
CSS matches: div.cd.ab
CSS matches: div.ab.cd

XPath matches: //div[@class="ab cd"]
XPath matches: //div[contains(@class, "ab")]
XPath matches: //div[contains(@class, "cd")]
XPath matches: //div[contains(@class, "ab") and contains(@class, "cd")]

XPath DOES NOT match: //div[@class="cd"]
XPath DOES NOT match: //div[@class="ab"]
XPath DOES NOT match: //div[@class="cd ab"]

评论

0赞 Matt I 1/5/2018
嗯,这是一本非常有趣的读物。我很欣赏这个信息!当你说 xpath 只和写它的人一样脆弱时,我怎么知道我是否使用了正确的路径(假设这是弱点)?
2赞 Robbie Wareham 1/5/2018
xpath 没有“正确的路径”,但 CSS 选择器也是如此。举个例子,以这个页面和你的签名图片为例。以下 XPATH 将起作用;body/div[3]/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[1]/td[2]/div[1]/table[1]/tbody/tr/td[2]/div[1]/div[2]/a/div/img 它每次都会找到您的图像,但如果 HTML 布局有微小的变化,它很容易损坏。我称之为脆弱的XPATH。重要的是要认识到,我可以很容易地用CSS写这个,就像很糟糕一样!
2赞 Robbie Wareham 1/5/2018
更好的 xpath 可以是 '//div[contains(@class, “question”)]//a[@href=“/users/6402048/matt-i”]//img'。这将更能适应结构性变化。铌。在这种情况下,我可能会使用CSS,因为它可能更清晰;'.question a[href=“/users/6402048/matt-i”] >img' 但是,要创建 Xpath(或者实际上是 CSS 选择器),您需要了解 AUT 以及您尝试测试的内容
1赞 Robbie Wareham 3/30/2018
@MattI 如果您认为它解决了您的问题,请随时将其标记为答案