Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在selenium中使用自己的选择器的利弊_Selenium_Selector - Fatal编程技术网

在selenium中使用自己的选择器的利弊

在selenium中使用自己的选择器的利弊,selenium,selector,Selenium,Selector,我想通过类实现我自己的,以便拥有自定义选择器。使用自定义选择器的优缺点是什么 开发代码 <button class="btn js-AddNuts" type="button" testid="addbutton"> 这里的选择器是testid 原因:我们计划为开发代码中的所有元素提供特定于测试的选择器和设计名称,以便它们在开发中更改任何内容时不会影响测试。正如您所知,创建自己的定位器没有问题,Selenium提供了创建自定义定位器的功能。基本上,当您要查找元素时,seleni

我想通过类实现我自己的
,以便拥有自定义选择器。使用自定义选择器的优缺点是什么

开发代码

<button class="btn js-AddNuts" type="button" testid="addbutton">

这里的选择器是
testid


原因:我们计划为开发代码中的所有元素提供特定于测试的选择器和设计名称,以便它们在开发中更改任何内容时不会影响测试。

正如您所知,创建自己的定位器没有问题,Selenium提供了创建自定义定位器的功能。基本上,当您要查找元素时,selenium内部使用
xPath
来查找元素。因此,您可以通过扩展
by
类来创建自己的定位器

如果您想创建一个自定义定位器,该定位器使用
testid
定位元素,您应该创建如下内容(假设您使用的是java):-

注意:您还可以使用
By.cssSelector
作为:
By.cssSelector(“*[testid=”+testid+“]”)在自定义的
By
类中定位元素


希望能有所帮助:)

在这种情况下(或我遇到或想到的任何情况下),无需创建自定义定位器。您可以简单地使用以下使用CSS选择器的代码

By.cssSelector("button[testid='addbutton']")
我建议您花一些时间阅读和学习CSS选择器。他们非常强大


为什么您要创建自己的自定义选择器,而它可以通过.cssSelector
、.xpath等简单地查找。。。。???详细说明您的目的…使用reasonSelenium更新的问题在内部不使用XPath查找元素By.id、By.name`。此外,如果可以使用CSS选择器,则不应推荐XPath。请注意,您还忘记回答这个问题。@FlorentB。是的,当然我们可以在这里使用
By.cssSelector
,但在这里它只指向单个属性,所以如果我们使用
By.xpath
,我认为这一点没有问题。正如你在这个链接中看到的。。。显然,在else条件下使用xpath查找元素是非常必要的。即使它指向一个属性,您也应该推荐CSS选择器,因为它比较便宜。不,Selenium不使用XPath通过.id查找元素。您提到的else条件是不支持location by id的驱动程序的回退。Java客户机是唯一实现它的客户机,我不知道有任何驱动程序满足此条件。请注意,您的XPath也不正确,它应该与上下文相关,而不是与页面相关(
//
,而不是
/
)。@FlorentB我非常理解您的观点。。我已经用cssSelector更新了答案来定位元素。。谢谢你指点我…但我不明白为什么提供的xpath不正确。。。你能给我一些可能不正确的场景吗…:)@Saurabh Gaur,从一个元素搜索整个页面是没有意义的。例如
driver.findElement(by.Id('foo1')).findElement(newbytestid(“foo2”)
表示您想要
foo2
,它位于
foo1
内。如果要在整个页面中搜索“foo2”,那么只需调用
driver.findElement(newbytestid(“foo2”)。您可能忽略了上下文是驱动程序或元素这一事实。正如我已经问过的,OP有兴趣创建自己的自定义选择器。。谢谢,你能给我的答案投反对票的原因吗…:)@SaurabhGaur不,OP问的是,“使用自定义选择器的优缺点是什么。”主要的缺点是没有必要。我想不出有什么好的方法来创建一个全新的定位器,它可以做其他选择器已经做过的事情。您在回答中没有列出创建自定义定位器的专业知识,您只是提供了如何创建自定义定位器。为什么不需要自定义选择器…如果不需要,为什么selenium提供我们创建自定义定位器。。。??为什么硒本身提供不同类型的定位器??。。。据OP报道,他想创建自定义定位器,让那些不知道如何创建xPath或cssSelector的人的生活更轻松…这对那些人来说非常有益…他们只是在我们创建ID时按对象创建自定义,如果我们可以简单地通过I'd来识别它…如果您可以简单地识别,为什么建议您使用by.ID定位器通过.Id…?@SaurabhGaur我说,“在这种情况下,没有必要创建自定义定位器。”并不是说永远都不需要。我想不出有什么需要,我已经做了一段时间了,从来没有遇到过现有的定位器不能满足需要的情况。仅仅因为它是可用的并不意味着为所有东西创建一个新的定位器是一个好的实践。是的,你能做到,但你为什么要这么做?有什么好处?
//for single webelement
WebElement element = driver.findElement(new ByTestId("addbutton"));

//for list of webelements
List<WebElement> elements = driver.findElements(new ByTestId("addbutton"));
By.cssSelector("button[testid='addbutton']")