与findElement()一起使用的最有效的选择器是什么?

Pse*_*udo 7 java selenium selenium-webdriver

使用Selenium Web测试时,有几种方法可以识别WebElements.

根据我的经验,我使用了以下选择器:

  • 班级名称 -By.className()
  • CSS选择器 -By.cssSelector()
  • ID -By.id()
  • 链接文字 -By.linkText()
  • 姓名 -By.name()
  • 标签名称 -By.tagName()
  • XPath -By.xpath()

显然,当只有一个选项可用于定位元素时,我们必须使用那个,但是当可以使用多个方法时(例如:下面的div),应该如何确定使用哪种方法?选择器是否比其他选择器效率更高?有些更耐用吗?

<div class="class" id="id" name="name">Here's a div</div>
Run Code Online (Sandbox Code Playgroud)

Pse*_*udo 13

仅适用于s&gs ......

我计时每个标识符方法在五个单独的时间内找到div并平均找到元素所花费的时间.

WebDriver driver = new FirefoxDriver();
driver.get("file://<Path>/div.html");
long starttime = System.currentTimeMillis();
//driver.findElement(By.className("class"));
//driver.findElement(By.cssSelector("html body div"));
//driver.findElement(By.id("id"));
//driver.findElement(By.name("name"));
//driver.findElement(By.tagName("div"));
//driver.findElement(By.xpath("/html/body/div"));
long stoptime = System.currentTimeMillis();
System.out.println(stoptime-starttime + " milliseconds");
driver.quit();
Run Code Online (Sandbox Code Playgroud)

它们按平均运行时间排序.

  • CssSelector:(796ms + 430ms + 258ms + 408ms + 694ms)/ 5 = ~517.2ms
  • ClassName :( 670ms + 453ms + 812ms + 415ms + 474ms)/ 5 = ~564.8ms
  • 名称:(342ms + 901ms + 542ms + 847ms + 393ms)/ 5 = ~605ms
  • ID:(888ms + 700ms + 431ms + 550ms + 501ms)/ 5 = ~614ms
  • Xpath:(835ms + 770ms + 415ms + 491ms + 852ms)/ 5 = ~672.6ms
  • TagName:(998ms + 832ms + 1278ms + 227ms + 648ms)/ 5 = ~796.6ms

在阅读@JeffC的回答后,我决定将By.cssSelector()classname,tagname和id作为搜索词进行比较.再次,结果低于..

WebDriver driver = new FirefoxDriver();
driver.get("file://<Path>/div.html");
long starttime = System.currentTimeMillis();
//driver.findElement(By.cssSelector(".class"));
//driver.findElement(By.className("class"));
//driver.findElement(By.cssSelector("#id"));
//driver.findElement(By.id("id"));
//driver.findElement(By.cssSelector("div"));
//driver.findElement(By.tagName("div"));
long stoptime = System.currentTimeMillis();
System.out.println(stoptime-starttime + " milliseconds");
driver.quit();
Run Code Online (Sandbox Code Playgroud)
  • By.cssSelector(".class"):(327ms + 165ms + 166ms + 282ms + 55ms)/ 5 = ~199ms
  • By.className("class"):(338ms + 801ms + 529ms + 804ms + 281ms)/ 5 = ~550ms
  • By.cssSelector("#id"):(58ms + 818ms + 261ms + 51ms + 72ms)/ 5 = ~252ms
  • By.id("id")- (820ms + 543ms + 112ms + 434ms + 738ms)/ 5 = ~529ms
  • By.cssSelector("div"):(594ms + 845ms + 455ms + 369ms + 173ms)/ 5 = ~487ms
  • By.tagName("div"):(825ms + 843ms + 715ms + 629ms + 1008ms)/ 5 = ~804ms

从这一点来看,似乎你应该使用css选择器来完成你所能做的一切!


Jef*_*ffC 6

根据我的经验,我按以下顺序使用这些定位器:

  1. ID
  2. LINKTEXT/partialLinkText
  3. CSS选择器
  4. XPath的

其他:类名,标签名,名称等都可以使用CSS选择器找到.我很少需要一个类名,所以我更喜欢CSS选择器,这样我可以使用多个类,但也指定一个标签名称,使其更具体,更不容易中断.很少使用标记名称...除非我们讨论TABLE或TR或TD标记,并且这些标记都可以使用CSS选择器完成.我通常发现带有a的标签name也是id我更喜欢的id.

我最近发现,正如你在答案中所做的那样,CSS选择器是最快的.这是有道理的,因为Selenium正在使用浏览器进行搜索,而CSS选择器非常常见,以至于不同的浏览器都为其使用提供了优化的性能.

linkText/partialLinkText非常专业,所以我真的不算数.我尽可能地使用它们,这是有道理的.我曾经考虑过只使用它,By.cssSelector("#someId")但我不认为它确实会产生那么大的差异,而且By.id()在使用Id时会更加明显.

我很少使用XPath,只有当我无法用其他定位器完成它时,例如在标签的文本或一些奇怪的子/后代的事情中我无法用CSS选择器完成它.我发现(并阅读)XPath支持因浏览器而异,并且速度较慢,所以除非绝对必要,否则我会避免它......我发现你可以找到99%的#1-3元素.

ids应该是最耐用的.LinkText和partialLinkText可能相当耐用,具体取决于页面.应用的类和用于CSS选择器的HTML结构可能最有可能随页面更新而更改.它实际上取决于更新的大小,以确定页面的部分部分是否已更改.CSS选择器和XPath都会(通常)受到这些类型的更改的影响.

最后......只要您没有抓取数百个元素的页面,一个页面转换可能比定位器方法之间几百毫秒的差异更重要.