在WebDriver中定位元素可以在WebDriver实例本身或WebElement上完成。前者返回与查询相匹配的WebElement对象,如果找不到这样的元素则抛出异常。后者返回一个WebElements列表,如果没有DOM元素匹配查询,则可能为空。
“查找”方法使用称为“By”的定位器或查询对象。
By ID
这是定位元素的最有效和首选的方法。UI开发人员常犯的错误是在页面上使用非唯一的ID或自动生成ID,两者都应避免。html元素上的类比自动生成的id更合适。
如何找到如下所示的元素的示例:
< div id = “coolestWidgetEvah” > ... </ div >
element = driver.find_element_by_id("coolestWidgetEvah")
By Class Name
在这种情况下,“类”是指DOM元素上的属性。通常在实际应用中有许多具有相同类名的DOM元素,因此找到多个元素成为找到第一个元素的更实际的选择。
如何找到如下所示的元素的示例:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
cheeses = driver.find_elements_by_class_name("cheese")
By Tag Name
元素的DOM标签名称。
如何找到如下所示的元素的示例:
<iframe src="..."></iframe>
frame = driver.find_element_by_tag_name("iframe")
By Name
找到匹配name属性的输入元素。
如何找到如下所示的元素的示例:
<input name="cheese" type="text"/>
cheese = driver.find_element_by_name("cheese")
By Link Text
找到匹配可见文本的链接元素。
如何找到如下所示的元素的示例:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
cheese = driver.find_element_by_link_text("cheese")
By Partial Link Text
找到部分匹配可见文本的链接元素。
如何找到如下所示的元素的示例:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
cheese = driver.find_element_by_partial_link_text("cheese")
By CSS
就像这个名字所暗示的那样,它是一个由css定位的策略。默认情况下使用本地浏览器支持,因此请参阅w3c css选择器以获取一般可用的css选择器列表。如果浏览器不支持css查询,则使用Sizzle。IE6,7和FF3.0目前使用
并非所有浏览器都是平等的,一些可能在一个版本中运行的css可能无法在另一个版本中运行。
<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
By XPath
在高层次上,WebDriver尽可能使用浏览器的本地XPath功能。
Driver | Tag and Attribute Name | Attribute Values | Native XPath Support |
---|---|---|---|
HtmlUnit Driver | Lower-cased | As they appear in the HTML | Yes |
Internet Explorer Driver | Lower-cased | As they appear in the HTML | No |
Firefox Driver | Case insensitive | As they appear in the HTML | Yes |
< input type = “text” name = “example” /> < INPUT type = “text” name = “other” />
inputs = driver.find_elements_by_xpath("//input")
比较显示:
XPath expression | HtmlUnit Driver | Firefox Driver | Internet Explorer Driver |
---|---|---|---|
//input | 1 (“example”) | 2 | 2 |
//INPUT | 0 | 2 | 0 |
有时HTML元素不需要显式声明属性,因为它们默认为已知值。例如,“输入”标签不需要“类型”属性,因为它默认为“文本”。在WebDriver中使用xpath时的经验法则是,不应该期望能够匹配这些隐式属性。
使用JavaScript
可以执行任意javascript来查找元素,只要您返回DOM元素,它将自动转换为WebElement对象。
jQuery加载的页面上的简单示例:
element = driver.execute_script("return $('.cheese')[0]")
为页面上的每个标签查找所有输入元素:
labels = driver.find_elements_by_tag_name("label") inputs = driver.execute_script( "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" + "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels)