当前位置: 首页 > 知识库问答 >
问题:

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

王英彦
2023-03-14

硒包括findElement功能,像这样...

.find_element_by_

id
link_text
partial_link_text
name
class_name
tag_name
css_selector
xpath

很明显,由于HTML页面的创建方式,一些标签受到设计的限制,例如id、链接文本、名称、标记名称,因为并非所有标记都可能包含id、链接文本等。。。然而,css_选择器和xpath几乎可以完成它们所能做的所有事情,还有一些,但它们似乎在与什么进行交互方面受到限制。例如,一些按钮可能无法通过xpath单击,但可以通过css_选择器单击。

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

其他函数(id、link_text等)是否非常有用,因为(至少)我发现xpath/css_选择器也可以这么做?

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

共有2个答案

陆和泰
2023-03-14

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

id、name、tag_name和class_name都可以通过简单的CSS轻松复制,所以我会避免显式使用它们。

例如

id;#my_id

名称[name=“my_name”]

tag_name;my_tag

class_name。我的班

XPath的使用经常被恶意中伤;被贴上缓慢和不稳定的标签。然而,我不同意这个观点。

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

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

>

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

    XPath可以选择基于文本,而CSS选择器不能

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

    如果可能的话,我总是避免通过文本进行选择,但是如果有必要的话,我更喜欢使用XPath而不是内置的链接文本和部分链接文本方法,因为XPath查询将允许我更具表现力,并允许我选择不仅仅是锚标签。

    最后,在使用XPath时,有一个问题是“类”被视为文本字符串,而不是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"]
    

  • 方波娃
    2023-03-14

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

    • id:选择具有指定的id属性的元素

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

    答案是硒最近进化了很多WebDriver现在是W3C推荐候选人。Selenium中的事物变化非常快。这不仅仅是选择定位器的问题。我们需要使用一个定位器,它将:

    • 唯一地标识一个元素

    记住这两个因素,最好的策略是模仿DOM。W3C推荐候选人确实提到了定位器列表,如下所示:

    因此,判决是明确和简洁的。

     类似资料:
    • 问题内容: __用于 bindActionCreators的 Redux 文档指出: 唯一的用例是,当您要将某些操作创建者传递给一个不了解Redux的组件,并且您不想将调度或Redux存储传递给该组件时。 在哪里使用/需要一个示例? 哪种组件不知道 Redux ? 两种选择的优点/缺点是什么? 问题答案: 我认为最受欢迎的答案实际上并不能解决这个问题。 下面的所有示例基本上都执行相同的操作,并且遵

    • 问题内容: 我了解OOP语言(例如C ++)中的构造函数的概念。但是,我不确定何时在REACT中使用构造函数。我确实了解JavaScript是面向对象的,但是我不确定构造器实际上是在“构造”什么。 呈现子组件时,子组件中是否需要构造函数?例如: 为了简洁起见,我将简短示例。但是,为什么需要构造函数?您是否需要在子组件中使用一个构造函数来构造道具? 我的ES6知识很可能还没有达到标准。 问题答案:

    • 通过和,我们将获得两种非常相似的在ES6中编写函数的方法。在其他语言中,lambda函数通常以匿名的方式区别于其他语言,但在ECMAScript中,任何函数都可以是匿名的。这两种类型都有独特的使用域(即当需要显式绑定或显式不绑定时)。在这两个领域之间,有很多情况下,任何一种表示法都可以。 ES6中的箭头函数至少有两个限制: null null

    • 问题内容: 嗨,我想知道何时才是使用htmlspecialchars()的适当位置。是在将数据插入数据库之前还是从数据库中检索数据时? 问题答案: 仅在将数据回显为HTML时才应调用此方法。 不要将转义的HTML存储在数据库中;它只会使查询更烦人。 数据库应存储您的实际数据,而不是其HTML表示形式。

    • 我读了一些代码,遇到了function.identity(),我发现它类似于s->s。我不明白为什么和什么时候应该使用function.identity()。 我试图通过一个例子来理解,但它并没有澄清我的问题: 在打印带有和不带有映射的列表元素时,我得到的结果是相同的: 谢谢

    • 问题内容: 为什么将某些代码模式(当存在于JVM内部类中时)转换为内在函数,而将相同的模式从我自己的类中调用时却不是。 例: 从Integer中调用bitCount函数时,bitCount(i)将转换为内部函数。但是,当复制到我的班级然后调用时,执行将花费更长的时间。 比较 问题答案: 答案很简单:以这种方式定义内在函数,因为存在一种更快,本机的方法来获取函数结果,并且可以在指定映射的情况下使用该