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

Mat*_*t I 1 python selenium css-selectors python-3.x selenium-webdriver

Selenium 包含 findElement 函数,就像这样......

.find_element_by_

id
link_text
partial_link_text
name
class_name
tag_name
css_selector
xpath
Run Code Online (Sandbox Code Playgroud)

显然,由于 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 也可以做到这一点?

相比 xpath/css_selector 使用 link_text 有什么好处吗?

Rob*_*ham 8

根据我的经验,CSS是更好的选择器,因为它简洁,文档齐全,并且 Web 开发人员可能有更多的经验和接触它。

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

例如

ID ; #我的身份

姓名; [名称=“我的名字”]

标签名; 我的标签

班级名称; 。我的课

XPath的使用常常受到很多诟病。被标记为缓慢且不稳定。不过我不同意这个观点。

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

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

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

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

  • XPath 允许您遍历 DOM 树,如果您只能通过其子控件来识别控件,这将非常有用

如果可能的话,我总是会避免通过文本进行选择,但如果必须的话,我更愿意使用 XPath 而不是内置的链接文本部分链接文本方法,因为 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"]
Run Code Online (Sandbox Code Playgroud)

  • 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认同)
  • 更好的 xpath 可能是 '//div[contains(@class, "question")]//a[@href="/users/6402048/matt-i"]//img'。这将更能适应结构性变化。注意。在这种情况下,我可能会使用 CSS,因为它会更清晰;'.question a[href="/users/6402048/matt-i"] &gt;img' 但是,要创建 Xpath(或者实际上是 CSS 选择器),您需要了解 AUT 以及您要测试的内容 (2认同)

Deb*_*anB 5

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

  • id:选择具有指定id属性的元素。
  • name:选择具有指定name属性的第一个元素。
  • link_text :选择包含与指定匹配的文本的链接(锚标记)元素LinkText
  • partial_link_text :选择包含与指定匹配的文本的链接(锚标记)元素PartialLinkText
  • tag_name:使用 .tag_name 定位元素Tag Name
  • class_name:使用ClassName.
  • css_selector:使用 选择元素CssSelectors
  • xpath:使用表达式定位元素XPath

所以现在的问题是有什么新鲜事

答案是Selenium 最近已经发展了很多WebDriver现在是一个W3C Recommendation Candidate. 里面的事情Selenium变化得很快。这不再仅仅是选择定位器的问题。我们需要使用一个定位器,它将:

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

牢记这两个因素,最好的策略是Mock DOM。该W3C Recommendation Candidate确实提到了定位器列表,如下所示:

Selenium_定位器

因此,判决是清晰、简洁的。

  • 稳定性取决于您编写自动化代码的效率,我在我的答案中详细介绍了这一点。为了实现最佳性能,我确实为您提供了“W3C推荐”中以“css”开始并以“xpath”结束的顺序选项。然而 `css` 和 `xpath` 很容易受到 DOM 变化的影响。如果这能回答您的问题,请告诉我。 (2认同)