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

2024-10-03 00:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

Selenium包含findElement函数,如。。。你知道吗

。按元素查找元素

id
link_text
partial_link_text
name
class_name
tag_name
css_selector
xpath

很明显,由于HTML页面是如何创建的,有些页面受到设计的限制,比如id、link\u text、name、tag\u name,因为并非所有的标签都包含id、link\u text等。。。然而,css\u选择器和xpath可以做几乎所有这些可以做的事情,然后是一些,但是似乎它们只能与什么交互。例如,某些按钮可能无法使用xpath单击,但可以通过css\u选择器单击。你知道吗

所以我想知道,什么时候一个要使用一个而不是另一个(特别是xpath或css\u选择器)?你知道吗

其他函数(id、link\utext等)是否非常有用,因为(至少)我发现xpath/css\u选择器也可以这么做?你知道吗

在xpath/css选择器上使用链接文本有什么好处吗?你知道吗


Tags: 函数textnameid元素tagseleniumlink
2条回答

这个问题已经在许多论坛上被提出和回答,包括stackoverflow.com和其他不同形式的论坛。考虑到所有这些因素,如果我们对定位器进行优先排序,列表如下:

  • id:选择具有指定id属性的元素。你知道吗
  • name:选择具有指定name属性的第一个元素。你知道吗
  • link_text:选择包含与指定的Link Text匹配的Text的链接(锚定标记)元素。你知道吗
  • partial_link_text:选择包含与指定的Partial Link Text匹配的Text的链接(锚定标记)元素。你知道吗
  • tag_name:使用Tag Name定位元素。你知道吗
  • class_name:使用Class Name定位元素。你知道吗
  • css_selector:使用css selectors选择元素。你知道吗
  • xpath:使用XPath表达式定位元素。你知道吗

所以现在的问题是什么是新的?你知道吗

答案是硒最近进化了很多。WebDriver现在是^{}。在Selenium内的事物变化非常快。不仅仅是选择定位器。我们需要使用一个定位器,它将:

  • Uniquely identify an element.
  • The performance of the locator must be optimized.

记住这两个因素,最好的策略是模拟DOM。^{}确实提到了定位器列表,如下所示:

Selenium_Locators

所以判决是明确和简洁的。你知道吗

根据我的经验,CSS是最好的选择,因为它可以简洁,有很好的文档记录,而且web开发人员可能对它有更多的经验和接触。你知道吗

idnametag\u nameclass\u name都可以用简单的CSS轻松复制,因此我避免显式使用它们。你知道吗

例如

我的id

姓名

标签名称

班级名称。我的班级

XPath的使用经常被人诟病;被标记为缓慢和不稳定。但是我不同意这个观点。你知道吗

当我采访人们时,当他们说他们避免使用Xpath时,我会畏缩,因为Xpath既慢又脆。速度不再是一个问题,xpath只会像编写它的人一样脆弱。但是,我更喜欢CSS选择器的语法,所以对于大多数用例,我会选择XPath。你知道吗

有3种情况下XPath是更好的选择

  • 多个CSS选择器可以替换为一个XPath查询(例如find element,然后在一个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"]

相关问题 更多 >