以下定位技术有什么区别?
element(by.id("id"));
element(by.css("#id"));
element(by.xpath("//*[@id='id']"));
browser.executeScript("return document.querySelector('#id');");
browser.executeScript("return document.getElementById('id');");
并且,从性能角度,哪个是通过id定位元素的最快方式?
答案 0 :(得分:8)
你的问题很难回答,当然要给出一个明确的答案。事实上,我很想将这个问题标记为“过于宽泛”,其他答案和评论都支持这个问题。
例如,仅使用element(by.id("id"));
。通过Selenium源代码,大多数驱动程序只需获取您提供的任何ID,并将其传递给有线协议:
public WebElement findElementById(String using) {
if (getW3CStandardComplianceLevel() == 0) {
return findElement("id", using);
} else {
return findElementByCssSelector("#" + cssEscape(using));
}
}
如您所知,每个浏览器供应商都在单独的二进制文件中实现自己的有线协议。随意进入代码,为自己挖掘更深的洞。
对于不支持有线协议的其他浏览器,例如HtmlUnit,您只需要:
public List<WebElement> findElementsById(String id) {
return findElementsByXPath("//*[@id='" + id + "']");
}
然后他们解析可用的DOM。
至于你的表现问题,任何人给你的任何东西都将是1)只是感觉,或2)纯粹的BS!您可以从其他答案和评论中看到这些内容。
要获得真实的答案(由实际数据支持),需要考虑的变量太多:
此外,由于用于构建该网站的框架存在差异,因此您在网络应用/网页上获得的任何结果都不会适用于其他网络应用/网页。
底线是:如果您担心性能测试,那么Selenium是错误的答案。 Selenium是一个功能测试库,经过优化,可为您提供最佳的最终用户代表。表演是一个遥远的事后想法。
如果您的目标是让测试运行得更快,那么花在查看测试结构上的时间会更好:
但我认为这是从你最初的问题中脱离主题(有些可能暗示“暴力”)。
答案 1 :(得分:5)
我只考虑性能视角并编写以下脚本来检查Google徽标。虽然结果令人困惑,但我们可以统计估计结果。
querySelector 和 getElementById 总是有更好的结果,除非试用次数超过10K。如果我们比较这两种方法: getElementById 更好(29比21)。
如果我们比较那些, ID , CSS 和 XPATH ,CSS会更好(29比18和4),第二是ID并持续一个XPATH。
我的测试结果: getElementById,querySelector,CSS,ID,XPATH
参见表格,结果和脚本:
表格显示了50次尝试的摘要结果:
1 2 3 4 5 ID 0 0 18 24 8 CSS 0 0 29 18 3 XPATH 0 0 4 12 34 querySelector 21 29 0 0 0 getElementById 29 21 0 0 0
时间差异的结果:
>>> for i in range(50):
... test_time(1)
...
[('getElementById', 0.004777193069458008), ('querySelector', 0.006440162658691406), ('id', 0.015267133712768555), ('css', 0.015399932861328125), ('xpath', 0.015429019927978516)]
[('querySelector', 0.006442070007324219), ('getElementById', 0.00728607177734375), ('id', 0.013181924819946289), ('css', 0.014509916305541992), ('xpath', 0.015583992004394531)]
[('getElementById', 0.0063440799713134766), ('querySelector', 0.006493091583251953), ('css', 0.014523029327392578), ('id', 0.014902830123901367), ('xpath', 0.015790224075317383)]
[('getElementById', 0.007112026214599609), ('querySelector', 0.007357120513916016), ('id', 0.014781951904296875), ('css', 0.015780925750732422), ('xpath', 0.016005992889404297)]
[('getElementById', 0.006434917449951172), ('querySelector', 0.007117033004760742), ('id', 0.01497507095336914), ('css', 0.015005111694335938), ('xpath', 0.015393972396850586)]
[('querySelector', 0.00563812255859375), ('getElementById', 0.006503105163574219), ('css', 0.014302968978881836), ('id', 0.014812946319580078), ('xpath', 0.017061948776245117)]
[('querySelector', 0.0048770904541015625), ('getElementById', 0.006540060043334961), ('css', 0.014795064926147461), ('id', 0.015192985534667969), ('xpath', 0.016000986099243164)]
[('getElementById', 0.006265878677368164), ('querySelector', 0.006501913070678711), ('id', 0.014132022857666016), ('css', 0.01437997817993164), ('xpath', 0.014840841293334961)]
[('getElementById', 0.006368160247802734), ('querySelector', 0.006601095199584961), ('css', 0.01462101936340332), ('id', 0.014872074127197266), ('xpath', 0.016145944595336914)]
[('querySelector', 0.00642704963684082), ('getElementById', 0.006908893585205078), ('css', 0.014439105987548828), ('id', 0.014970064163208008), ('xpath', 0.015510082244873047)]
[('getElementById', 0.006404876708984375), ('querySelector', 0.006679058074951172), ('css', 0.014878988265991211), ('id', 0.01546788215637207), ('xpath', 0.015535116195678711)]
[('querySelector', 0.005848884582519531), ('getElementById', 0.008013010025024414), ('css', 0.014436006546020508), ('xpath', 0.01566910743713379), ('id', 0.015830039978027344)]
[('querySelector', 0.006299018859863281), ('getElementById', 0.006538867950439453), ('css', 0.014534950256347656), ('id', 0.014979124069213867), ('xpath', 0.01618194580078125)]
[('getElementById', 0.006415128707885742), ('querySelector', 0.006479978561401367), ('id', 0.014901876449584961), ('css', 0.014998912811279297), ('xpath', 0.01544499397277832)]
[('getElementById', 0.006515979766845703), ('querySelector', 0.006515979766845703), ('xpath', 0.014292001724243164), ('css', 0.014482975006103516), ('id', 0.015102863311767578)]
[('getElementById', 0.00574803352355957), ('querySelector', 0.006389141082763672), ('css', 0.014650821685791016), ('id', 0.014751911163330078), ('xpath', 0.01532888412475586)]
[('getElementById', 0.0063037872314453125), ('querySelector', 0.006974935531616211), ('id', 0.014775991439819336), ('css', 0.014935970306396484), ('xpath', 0.015460968017578125)]
[('getElementById', 0.0064661502838134766), ('querySelector', 0.0065021514892578125), ('id', 0.014723062515258789), ('css', 0.014946937561035156), ('xpath', 0.015508890151977539)]
[('getElementById', 0.006738901138305664), ('querySelector', 0.008143901824951172), ('css', 0.014575004577636719), ('xpath', 0.015228986740112305), ('id', 0.015702009201049805)]
[('getElementById', 0.006436824798583984), ('querySelector', 0.0064470767974853516), ('css', 0.014545917510986328), ('id', 0.014694929122924805), ('xpath', 0.015357017517089844)]
[('querySelector', 0.006292104721069336), ('getElementById', 0.006451845169067383), ('css', 0.014657020568847656), ('xpath', 0.01574397087097168), ('id', 0.016795873641967773)]
[('getElementById', 0.006443977355957031), ('querySelector', 0.006485939025878906), ('css', 0.013139009475708008), ('id', 0.014308929443359375), ('xpath', 0.015516042709350586)]
[('querySelector', 0.006464958190917969), ('getElementById', 0.006821870803833008), ('id', 0.016110897064208984), ('css', 0.01633286476135254), ('xpath', 0.017225980758666992)]
[('getElementById', 0.005715131759643555), ('querySelector', 0.008069992065429688), ('css', 0.014779090881347656), ('id', 0.01491093635559082), ('xpath', 0.015527963638305664)]
[('getElementById', 0.006309986114501953), ('querySelector', 0.006836891174316406), ('css', 0.01497507095336914), ('id', 0.015040159225463867), ('xpath', 0.02096104621887207)]
[('querySelector', 0.00616908073425293), ('getElementById', 0.007357120513916016), ('css', 0.014974832534790039), ('id', 0.015640974044799805), ('xpath', 0.016278982162475586)]
[('querySelector', 0.005301952362060547), ('getElementById', 0.0063440799713134766), ('id', 0.014526844024658203), ('css', 0.014657974243164062), ('xpath', 0.0162200927734375)]
[('querySelector', 0.005811929702758789), ('getElementById', 0.007221221923828125), ('css', 0.01259613037109375), ('xpath', 0.014851093292236328), ('id', 0.015043020248413086)]
[('getElementById', 0.006195068359375), ('querySelector', 0.007548093795776367), ('css', 0.01441502571105957), ('id', 0.01441812515258789), ('xpath', 0.016713857650756836)]
[('querySelector', 0.0050449371337890625), ('getElementById', 0.006323099136352539), ('id', 0.01497793197631836), ('css', 0.014984130859375), ('xpath', 0.015444040298461914)]
[('getElementById', 0.007039070129394531), ('querySelector', 0.008107900619506836), ('xpath', 0.015566825866699219), ('id', 0.015954017639160156), ('css', 0.01815509796142578)]
[('getElementById', 0.005831003189086914), ('querySelector', 0.007988214492797852), ('id', 0.014652013778686523), ('css', 0.014683008193969727), ('xpath', 0.01581597328186035)]
[('querySelector', 0.006363868713378906), ('getElementById', 0.006494998931884766), ('xpath', 0.01517796516418457), ('id', 0.016071796417236328), ('css', 0.017260074615478516)]
[('getElementById', 0.00633692741394043), ('querySelector', 0.007826089859008789), ('css', 0.014354944229125977), ('id', 0.015484809875488281), ('xpath', 0.017076969146728516)]
[('querySelector', 0.006349802017211914), ('getElementById', 0.006428956985473633), ('css', 0.01385188102722168), ('id', 0.014858007431030273), ('xpath', 0.016836166381835938)]
[('querySelector', 0.006417989730834961), ('getElementById', 0.007012844085693359), ('css', 0.01460719108581543), ('id', 0.014763832092285156), ('xpath', 0.015476226806640625)]
[('getElementById', 0.006266117095947266), ('querySelector', 0.0074520111083984375), ('id', 0.014987945556640625), ('css', 0.01515817642211914), ('xpath', 0.015646934509277344)]
[('getElementById', 0.006376981735229492), ('querySelector', 0.0064089298248291016), ('id', 0.01494598388671875), ('css', 0.015275001525878906), ('xpath', 0.01553201675415039)]
[('getElementById', 0.006357908248901367), ('querySelector', 0.006699085235595703), ('css', 0.014505147933959961), ('xpath', 0.015446186065673828), ('id', 0.019747018814086914)]
[('getElementById', 0.0063610076904296875), ('querySelector', 0.0064640045166015625), ('css', 0.014472007751464844), ('id', 0.014828205108642578), ('xpath', 0.01532888412475586)]
[('getElementById', 0.0063610076904296875), ('querySelector', 0.006580829620361328), ('css', 0.012439966201782227), ('id', 0.014935016632080078), ('xpath', 0.015373945236206055)]
[('querySelector', 0.006309032440185547), ('getElementById', 0.006561994552612305), ('id', 0.014923095703125), ('css', 0.015380859375), ('xpath', 0.01574110984802246)]
[('querySelector', 0.006357908248901367), ('getElementById', 0.006387948989868164), ('css', 0.01481485366821289), ('id', 0.015089988708496094), ('xpath', 0.015390872955322266)]
[('querySelector', 0.004536867141723633), ('getElementById', 0.00640416145324707), ('css', 0.014551877975463867), ('xpath', 0.014974117279052734), ('id', 0.014991998672485352)]
[('getElementById', 0.006387233734130859), ('querySelector', 0.00643610954284668), ('css', 0.014494895935058594), ('id', 0.014873981475830078), ('xpath', 0.015212059020996094)]
[('getElementById', 0.0063588619232177734), ('querySelector', 0.006443977355957031), ('css', 0.013200998306274414), ('id', 0.014631986618041992), ('xpath', 0.015624046325683594)]
[('getElementById', 0.0048558712005615234), ('querySelector', 0.005300045013427734), ('id', 0.014750003814697266), ('css', 0.014846086502075195), ('xpath', 0.015408992767333984)]
[('querySelector', 0.008347034454345703), ('getElementById', 0.008370161056518555), ('id', 0.014650106430053711), ('css', 0.014775991439819336), ('xpath', 0.015323877334594727)]
[('querySelector', 0.006309032440185547), ('getElementById', 0.007323026657104492), ('css', 0.014546871185302734), ('xpath', 0.015864133834838867), ('id', 0.02078390121459961)]
[('querySelector', 0.007790088653564453), ('getElementById', 0.010209083557128906), ('id', 0.015320062637329102), ('xpath', 0.01600193977355957), ('css', 0.01807403564453125)]
代码:
from timeit import default_timer as timer
import time, operator
from selenium import webdriver
def open_browser():
dr = webdriver.Chrome()
dr.get('http://www.google.com')
time.sleep(5)
return dr,timer()
def quit_browser(el, start, dr, result):
diff = timer() - float(start)
result[el] = diff
dr.quit()
def test_time(tm):
result = {}
dr, start = open_browser()
for i in range(tm):
dr.find_element_by_id('hplogo')
quit_browser("id", start, dr, result)
dr, start = open_browser()
for i in range(tm):
dr.find_element_by_css_selector('#hplogo')
quit_browser("css", start, dr, result)
dr, start = open_browser()
for i in range(tm):
dr.find_element_by_xpath("//*[@id='hplogo']")
quit_browser("xpath", start, dr, result)
dr, start = open_browser()
for i in range(tm):
dr.execute_script("return document.querySelector('#hplogo');")
quit_browser("querySelector", start, dr, result)
dr, start = open_browser()
for i in range(tm):
dr.execute_script("return document.getElementById('hplogo');")
quit_browser("getElementById", start, dr, result)
print sorted(result.items(), key=operator.itemgetter(1))
答案 2 :(得分:4)
element(by.id("id"));
element(by.css("#id"));
element(by.xpath("//*[@id='id']"));
browser.executeScript("return document.getElementById('id');");
browser.executeScript("return document.querySelector('#id');");
我会尝试一下。我将尝试解释它,直到Protractor
和WebdriverJS
为止。因为我没有写Selenium
或浏览器的驱动程序(例如Chromedriver
,Firefoxdriver
...等...),这是浏览器和Selenium
之间的通信。为此,我将使用浏览器引擎的标准知识。因此答案,它不会100%准确,但大多数。
对于前3种方法:
元素(by.id(&#34; ID&#34));
元素(by.css(&#34;#标识&#34));
元素(by.xpath(&#34; // * [@ id中=&#39; ID&#39;]&#34));
这些都是对Selenium服务器的单个HTTP请求的结果。这是:
'/session/:sessionId/element/:id/element'
有2个参数:
using
::id
的类型。示例:'css select'
,'id'
,&#39; xpath'
,'link text'
...等.. value
::id
的值。示例'element-id'
,'.element-css > .child'
,//*[@id='id']
此时Selenium
将根据Chromedriver
,Firefoxdriver
...等提出的请求回复请求。
在Webdriver find-element-strategy.js下。因为看起来方法是通过javascript document
属性提供的浏览器映射的。我们得到了tag
,id
,css selector
,xpath
...等...与document.elementByTagName
,document.elementByID
,{{1 },document.querySelecotr
...
从编码器的角度来看,我会说无论这些驱动程序是如何编写的,都应该重用资源。例如,document.evaluate
的任务请求很可能通过通信驱动程序在浏览器端触发id
之类的内容。
=&GT; 摘要所以最后我们有:
getElementById
相当于css selector
querySelector
相当于id
getElementById
相当于xpath
最后两种方法:
browser.executeScript(&#34; return document.querySelector(&#39;#id&#39;);&#34;);
browser.executeScript(&#34; return document.getElementById(&#39; id&#39;);&#34;);
这些都是对Selenium服务器的单个HTTP请求的结果。这是:
evaluate
有2个参数:
'/session/:sessionId/execute'
:javascript文字(script
)或'string'
function
:参数是args
在此之前,它是关于如何将JS注入浏览器的,因为我们都不能确定行为(使用array
或将devtools
注入HTML)。让我们假设它对所有浏览器都是一样的。
=&GT; 摘要所以最后我们将分析:
<script>
querySelector
getElementById
vs element()
:<强> =&GT;摘要快到慢
browser.executeScript()
element()
browser.executeScript()
vs document.querySelector()
vs document.getElementById()
:同样,每个浏览器都会略有差异。但是已经有一些关于此的研究。我将使用已找到的社区。 p>
document.querySelector()
知道速度超过CSS selector
(source)
xpath
&gt;更快&gt; document.querySelector()
(注意:IE不支持xpath,所以每当你在带有量角器的IE上使用xpath时,selenium都使用自己的xpath引擎)
在jsperf.com
我们this测试说
document.evaluate()
&gt;更快&gt; document.getElementById()
<强> =&GT; SUMARY 快到慢
document.querySelector()
document.getElementById()
document.querySelector()
document.evaluate()
element(by.id("id"));
element(by.css("#id"));
element(by.xpath("//*[@id='id']"));
browser.executeScript("return document.getElementById('id');");
答案 3 :(得分:3)
识别差异将非常困难。以下是我发现的一些事情 -
executeScript()
计划在当前所选框架或窗口的上下文中以字符串形式执行JavaScript的命令。虽然这很快,但代码的可读性很低。
element()
函数依次解析为findElement()
函数,该函数调度命令以在DOM上查找元素。提高了可读性。
从性能的角度来看,根据我的说法,这里是从最快的开始按升序排列,所有这些排名彼此接近,差异在几毫秒之内 -
1 - browser.executeScript("return document.getElementById('id');");
2 - browser.executeScript("return document.querySelector('#id');");
3 - element(by.id("id"));
4 - element(by.css("#id"));
5 - element(by.xpath("//*[@id='id']"));
javascript executeScript()
速度如此之快的原因是因为命令直接在DOM上执行而没有转换。 This link justifies their rankings between each other
其余的量角器特定element()
定位器很慢,因为量角器需要使用findElement()
函数转换命令以获取web元素。按id
获取元素比使用css
和xpath
更快(这也取决于定位器的使用方式,并且通常可以根据使用情况进行更改)。
注意:以上性能分析是我在我的机器上本地运行的许多测试的平均值,但它可能因内部影响运行测试脚本的系统任务而有所不同。
希望它有所帮助。
答案 4 :(得分:0)
如果有人试图回答它,那将是一个广泛的答案,所以我会尝试尽可能简单。
这些只是使用硒寻找元素的不同方法。我们有很多选择元素的替代方案的原因是,并不总是我们将id或类标记为元素。对于没有id或类或名称的元素,我们唯一的选择是XPATH。
XPATH可用于唯一标识XML中的任何元素,因为HTML(HTML 5准确,如果根据标准编写)是XML的实例,我们可以使用XPATH唯一标识文件中的每个元素。
好的,为什么不一直使用XPATH?为什么有这么多选择? 简单,XPATH很难写。例如,如果我们需要获得属于嵌套在其他2个表中的表的&#39; 的XPATH。 XPATH会很长,而且大部分时间我们都会犯错误。
在firefox中查找XPATH非常简单,只需安装firepath或firebug并右键单击该元素并选择COPY XPATH。
关于硒指标的详细说明:here(以java格式提供,但一般会有所帮助)