提问人:Matt I 提问时间:1/2/2018 最后编辑:undetected SeleniumMatt I 更新时间:1/17/2023 访问量:4357
在 Selenium 中的许多 findElement(s)/By 函数中,您什么时候会使用一个函数而不是另一个函数?
Of the many findElement(s)/By functions in Selenium, when would you use one over the other?
问:
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有什么好处吗?
答:
这个问题已经在许多论坛上以不同的形式提出和回答。考虑到所有这些,如果我们优先考虑定位器,列表将如下:
- 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
- 唯一标识元素。
- 必须优化定位器的性能。
牢记这两个因素,最好的策略是模拟 DOM。W3C 推荐候选
者确实提到了定位器列表,如下所示:
所以判决是清晰简洁的。
评论
Answer
The performance of the locator must be optimized.
css
xpath
W3C recommendation
css
xpath
根据我的经验,CSS 是首选的选择器,因为它可以简洁明了,有据可查,并且 Web 开发人员可能有更多的经验和接触。
id、name、tag_name 和 class_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"]
评论