在 Selenium Webdriver 中,Linktext 和 css 哪个在性能方面更好?
In Selenium Webdriver which is better in terms of performance Linktext or css?
在 Selenium
中,最好使用定位器 ID
定位元素。
最少的定位器是 XPath
(如果我错了请纠正我)。
那么,一个人应该使用 Locators 来识别 element
是否有任何优先顺序或顺序?
我只是从this参考中写了一些点,GK27已经在评论中提供了,写在这里的目的是为了清楚如果页面没有找到一段时间,用户可以从这里查看.
所以定位元素的更好方法,优先级应该在列表中 [id, name, linkText, partialLinkText, tagName, className, cssSelector, xpath]
这里列表中的第一个值 id
包含第一优先级等等。
按 ID 定位元素:
在网页上定位元素的最有效方式和首选方式是 ID
。 ID
将是网页上唯一的,可以轻松识别。
ID 是最安全、最快的定位器选项,应始终是首选
按名称定位元素:
当没有id可以用的时候,下一个值得看的是想要的元素有没有name属性。但要确保名称不能始终是唯一的。如果有多个名称,Selenium 将始终对第一个匹配的元素执行操作
通过链接文本定位元素:
查找带有 link 文本的元素非常简单。但是请确保,网页上只有一个唯一的 link。如果有多个 links 具有相同的 link 文本(例如重复的页眉和页脚菜单 links),在这种情况下,Selenium 将对第一个具有 [= 的匹配元素执行操作126=].
通过部分链接文本定位元素:
和LinkText
一样,PartialLinkText
也是同样的模式,唯一不同的是它匹配link部分文本意味着使用contains。
按标记名定位元素:
TagName
可与 、Select 和复选框/下拉列表等组元素一起使用。
通过 Class 名称定位元素:
可能有多个元素具有相同的class名称,如果我们只使用findElementByClassName
,请确保它只有一个。如果不是,您需要使用 classname
及其子元素进行扩展。
CSS Select或:
CSS主要用于为网页提供样式规则,我们可以使用css来标识网页中的一个或多个元素。
如果您开始使用 css 选择器来识别元素,与 XPath
相比,您会喜欢它的速度。
我们可以使用 Css Select 或者确保脚本 运行 在 IE 浏览器中具有相同的速度。 CSS 选择器始终是在页面中定位复杂元素的最佳方式。
如果您需要使用复杂选择器查找元素,我通常建议尽可能使用 CSS Selectors。它不像 XPath 那样灵活,但会涵盖许多相同的情况,而不会像 XPath 那样在 IE 上表现出极端的性能损失。
XPath Select或:
通过 XPath
查找元素对于使用非常复杂的选择器查找元素很有用,并且是最灵活的选择策略,但它有可能非常慢,特别是在 IE
。在 IE
6、7 或 8 中,通过 XPath
查找可能比在 Firefox
中执行相同操作慢一个数量级。 IE
不提供本机 XPath-over-HTML
解决方案,因此该项目必须使用 JavaScript XPath
实现,以及 IE
遗留版本中的 JavaScript 引擎真的是那么慢。
xpath有两种类型
- Native Xpath,就像直接让xpath走。像
例子:
html/head/body/table/tr/td
这里指定本机路径的好处是,找到一个元素非常容易,因为我们提到了直接路径。但是如果路径有任何变化(如果某些东西已经 added/removed)那么 xpath 将会中断。
- 相对 Xpath。
在相对 xpath 中,我们将提供相对路径,这就像我们通过告诉 xpath 之间的路径来告诉 xpath 找到一个元素。
这里的优点是,如果 html 中有任何变化都可以正常工作,除非该特定路径已更改。查找地址将非常困难,因为它需要检查每个节点以找到该路径。
这是在 https://whosebug.com/questions 上定位元素的不同方法的一个小基准:
Chrome 52,驱动2.22
15 ms for execute_script("return [].find.call(document.getElementsByTagName('a'), function(e){return e.textContent.trim() == 'Physics'});")
15 ms for find_element_by_css_selector("#footer-sites > table > tbody > tr:nth-child(2) > td:nth-child(7) > ol > li:nth-child(2) > a")
15 ms for find_element_by_css_selector("[title='go to page 2']")
15 ms for find_element_by_xpath("//*[@id='footer-sites']/table/tbody/tr[2]/td[7]/ol/li[3]/a")
16 ms for find_element_by_class_name("top-footer-links")
16 ms for find_element_by_css_selector("a[href$='math.stackexchange.com']")
16 ms for find_element_by_id("footer-sites")
16 ms for find_element_by_name("q")
16 ms for find_element_by_xpath("//a[text()='Ask Ubuntu']")
31 ms for find_element_by_xpath("//*[normalize-space(.)='Game Development']")
311 ms for find_element_by_link_text("Area 51")
343 ms for find_element_by_partial_link_text("Stack Apps")
Firefox 2.47,驱动程序 2.53.0
16 ms for find_element_by_class_name("top-footer-links")
16 ms for find_element_by_css_selector("#footer-sites > table > tbody > tr:nth-child(2) > td:nth-child(7) > ol > li:nth-child(2) > a")
16 ms for find_element_by_css_selector("a[href$='math.stackexchange.com']")
16 ms for find_element_by_id("footer-sites")
16 ms for find_element_by_name("q")
23 ms for execute_script("return [].find.call(document.getElementsByTagName('a'), function(e){return e.textContent.trim() == 'Physics'});")
23 ms for find_element_by_css_selector("[title='go to page 2']")
47 ms for find_element_by_xpath("//*[@id='footer-sites']/table/tbody/tr[2]/td[7]/ol/li[3]/a")
47 ms for find_element_by_xpath("//a[text()='Ask Ubuntu']")
62 ms for find_element_by_xpath("//*[normalize-space(.)='Game Development']")
1625 ms for find_element_by_link_text("Area 51")
1726 ms for find_element_by_partial_link_text("Stack Apps")
Internet Explorer 11,驱动程序 2.53.1
77 ms for find_element_by_name("q")
78 ms for execute_script("return [].find.call(document.getElementsByTagName('a'), function(e){return e.textContent.trim() == 'Physics'});")
78 ms for find_element_by_class_name("top-footer-links")
78 ms for find_element_by_id("footer-sites")
93 ms for find_element_by_xpath("//*[@id='footer-sites']/table/tbody/tr[2]/td[7]/ol/li[3]/a")
108 ms for find_element_by_xpath("//a[text()='Ask Ubuntu']")
109 ms for find_element_by_css_selector("#footer-sites > table > tbody > tr:nth-child(2) > td:nth-child(7) > ol > li:nth-child(2) > a")
125 ms for find_element_by_css_selector("[title='go to page 2']")
125 ms for find_element_by_css_selector("a[href$='math.stackexchange.com']")
140 ms for find_element_by_xpath("//*[normalize-space(.)='Game Development']")
801 ms for find_element_by_link_text("Area 51")
812 ms for find_element_by_partial_link_text("Stack Apps")
在 Selenium
中,最好使用定位器 ID
定位元素。
最少的定位器是 XPath
(如果我错了请纠正我)。
那么,一个人应该使用 Locators 来识别 element
是否有任何优先顺序或顺序?
我只是从this参考中写了一些点,GK27已经在评论中提供了,写在这里的目的是为了清楚如果页面没有找到一段时间,用户可以从这里查看.
所以定位元素的更好方法,优先级应该在列表中 [id, name, linkText, partialLinkText, tagName, className, cssSelector, xpath]
这里列表中的第一个值 id
包含第一优先级等等。
按 ID 定位元素:
在网页上定位元素的最有效方式和首选方式是 ID
。 ID
将是网页上唯一的,可以轻松识别。
ID 是最安全、最快的定位器选项,应始终是首选
按名称定位元素:
当没有id可以用的时候,下一个值得看的是想要的元素有没有name属性。但要确保名称不能始终是唯一的。如果有多个名称,Selenium 将始终对第一个匹配的元素执行操作
通过链接文本定位元素:
查找带有 link 文本的元素非常简单。但是请确保,网页上只有一个唯一的 link。如果有多个 links 具有相同的 link 文本(例如重复的页眉和页脚菜单 links),在这种情况下,Selenium 将对第一个具有 [= 的匹配元素执行操作126=].
通过部分链接文本定位元素:
和LinkText
一样,PartialLinkText
也是同样的模式,唯一不同的是它匹配link部分文本意味着使用contains。
按标记名定位元素:
TagName
可与 、Select 和复选框/下拉列表等组元素一起使用。
通过 Class 名称定位元素:
可能有多个元素具有相同的class名称,如果我们只使用findElementByClassName
,请确保它只有一个。如果不是,您需要使用 classname
及其子元素进行扩展。
CSS Select或:
CSS主要用于为网页提供样式规则,我们可以使用css来标识网页中的一个或多个元素。
如果您开始使用 css 选择器来识别元素,与 XPath
相比,您会喜欢它的速度。
我们可以使用 Css Select 或者确保脚本 运行 在 IE 浏览器中具有相同的速度。 CSS 选择器始终是在页面中定位复杂元素的最佳方式。
如果您需要使用复杂选择器查找元素,我通常建议尽可能使用 CSS Selectors。它不像 XPath 那样灵活,但会涵盖许多相同的情况,而不会像 XPath 那样在 IE 上表现出极端的性能损失。
XPath Select或:
通过 XPath
查找元素对于使用非常复杂的选择器查找元素很有用,并且是最灵活的选择策略,但它有可能非常慢,特别是在 IE
。在 IE
6、7 或 8 中,通过 XPath
查找可能比在 Firefox
中执行相同操作慢一个数量级。 IE
不提供本机 XPath-over-HTML
解决方案,因此该项目必须使用 JavaScript XPath
实现,以及 IE
遗留版本中的 JavaScript 引擎真的是那么慢。
xpath有两种类型
- Native Xpath,就像直接让xpath走。像
例子:
html/head/body/table/tr/td
这里指定本机路径的好处是,找到一个元素非常容易,因为我们提到了直接路径。但是如果路径有任何变化(如果某些东西已经 added/removed)那么 xpath 将会中断。
- 相对 Xpath。 在相对 xpath 中,我们将提供相对路径,这就像我们通过告诉 xpath 之间的路径来告诉 xpath 找到一个元素。 这里的优点是,如果 html 中有任何变化都可以正常工作,除非该特定路径已更改。查找地址将非常困难,因为它需要检查每个节点以找到该路径。
这是在 https://whosebug.com/questions 上定位元素的不同方法的一个小基准:
Chrome 52,驱动2.22
15 ms for execute_script("return [].find.call(document.getElementsByTagName('a'), function(e){return e.textContent.trim() == 'Physics'});")
15 ms for find_element_by_css_selector("#footer-sites > table > tbody > tr:nth-child(2) > td:nth-child(7) > ol > li:nth-child(2) > a")
15 ms for find_element_by_css_selector("[title='go to page 2']")
15 ms for find_element_by_xpath("//*[@id='footer-sites']/table/tbody/tr[2]/td[7]/ol/li[3]/a")
16 ms for find_element_by_class_name("top-footer-links")
16 ms for find_element_by_css_selector("a[href$='math.stackexchange.com']")
16 ms for find_element_by_id("footer-sites")
16 ms for find_element_by_name("q")
16 ms for find_element_by_xpath("//a[text()='Ask Ubuntu']")
31 ms for find_element_by_xpath("//*[normalize-space(.)='Game Development']")
311 ms for find_element_by_link_text("Area 51")
343 ms for find_element_by_partial_link_text("Stack Apps")
Firefox 2.47,驱动程序 2.53.0
16 ms for find_element_by_class_name("top-footer-links")
16 ms for find_element_by_css_selector("#footer-sites > table > tbody > tr:nth-child(2) > td:nth-child(7) > ol > li:nth-child(2) > a")
16 ms for find_element_by_css_selector("a[href$='math.stackexchange.com']")
16 ms for find_element_by_id("footer-sites")
16 ms for find_element_by_name("q")
23 ms for execute_script("return [].find.call(document.getElementsByTagName('a'), function(e){return e.textContent.trim() == 'Physics'});")
23 ms for find_element_by_css_selector("[title='go to page 2']")
47 ms for find_element_by_xpath("//*[@id='footer-sites']/table/tbody/tr[2]/td[7]/ol/li[3]/a")
47 ms for find_element_by_xpath("//a[text()='Ask Ubuntu']")
62 ms for find_element_by_xpath("//*[normalize-space(.)='Game Development']")
1625 ms for find_element_by_link_text("Area 51")
1726 ms for find_element_by_partial_link_text("Stack Apps")
Internet Explorer 11,驱动程序 2.53.1
77 ms for find_element_by_name("q")
78 ms for execute_script("return [].find.call(document.getElementsByTagName('a'), function(e){return e.textContent.trim() == 'Physics'});")
78 ms for find_element_by_class_name("top-footer-links")
78 ms for find_element_by_id("footer-sites")
93 ms for find_element_by_xpath("//*[@id='footer-sites']/table/tbody/tr[2]/td[7]/ol/li[3]/a")
108 ms for find_element_by_xpath("//a[text()='Ask Ubuntu']")
109 ms for find_element_by_css_selector("#footer-sites > table > tbody > tr:nth-child(2) > td:nth-child(7) > ol > li:nth-child(2) > a")
125 ms for find_element_by_css_selector("[title='go to page 2']")
125 ms for find_element_by_css_selector("a[href$='math.stackexchange.com']")
140 ms for find_element_by_xpath("//*[normalize-space(.)='Game Development']")
801 ms for find_element_by_link_text("Area 51")
812 ms for find_element_by_partial_link_text("Stack Apps")