在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下。
假设测试的页面源码为csdn的登录页面。
1.name
函数find_element_by_name()
举例:
假设我们要测试的页面源码为csdn的登录页面,如下:
<input id="username" name="username" tabindex="1" placeholder="输入用户名/邮箱/手机号" class="user-name" type="text" value="">
当我们要用name属性来引用这个input并写入值为admin时,代码如下:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://passport.csdn.net/?service=http://write.blog.csdn.net/postedit?ref=toolbar") #登录界面
driver.find_element_by_name("username").send_keys("admin")
2.id
函数 find_element_by_id()
举例:
<input id="username" name="username" tabindex="1" placeholder="输入用户名/邮箱/手机号" class="user-name" type="text" value="">
当我们要用id属性来引用这个input并写入值为admin时,代码如下:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://passport.csdn.net/?service=http://write.blog.csdn.net/postedit?ref=toolbar") #登录界面
driver.find_element_by_id("username").send_keys("admin")
3.tag_name
函数find_elements_by_tag_name()
举例:
<input id="username" name="username" tabindex="1" placeholder="输入用户名/邮箱/手机号" class="user-name" type="text" value="">
该方法可以通过元素的标签名称来查找元素。该方法跟之前两个方法的区别是,这个方法搜索到的元素通常不止一个,所以一般建议结合使用findElements方法来使用。比如我们现在要查找页面上有多少个input,就可以用input这个tag_name来进行查找,代码如下:
4.class_name
函数find_elements_by_class_name
className属性是利用元素的css样式表所引用的伪类名称来进行元素查找的方法。对于任何HTML页面的元素来说,一般程序员或页面设计师会给元素直接赋予一个样式属性或者利用css文件里的伪类来定义元素样式,使元素在页面上显示时能够更加美观。
举例:
<input id="username" name="username" tabindex="1" placeholder="输入用户名/邮箱/手机号" class="user-name" type="text" value="">
当我们要用class_name属性来引用这个input并写入值为admin时,代码如下:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://passport.csdn.net/?service=http://write.blog.csdn.net/postedit?ref=toolbar") #登录界面
driver.find_element_by_class_name("user-name").send_keys("admin")
5.link_text
函数find_element_by_link_text
这个方法比较直接,即通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接。通常一个超文本链接会长成这个样子:
<a href="/intl/en/about.html">About Google</a>
我们定位这个元素时,可以使用下面的代码进行操作:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("http://www.forexample.com")
driver.find_element_by_link_text("About Google").click()
6.partial_link_text
函数find_elements_by_partial_link_text
这个方法是上一个方法的扩展。当你不能准确知道超链接上的文本信息或者只想通过一些关键字进行匹配时,可以使用这个方法来通过部分链接文字进行匹配。代码如下:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("http://www.forexample.com")
driver.find_element_by_link_text("About").click()
注意:使用这种方法进行定位时,可能会引起的问题是,当你的页面中不止一个超链接包含About时,findElement方法只会返回第一个查找到的元素,而不会返回所有符合条件的元素。如果你要想获得所有符合条件的元素,还是只能使用findElements方法。
7.xpath
函数find_elements_by_xpath
这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。在正式开始使用XPath进行定位前,我们先了解下什么是XPath。XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
对于谷歌浏览器来说,因其自带插件,所以只需复制xpath即可,如下所示:
我们定位这个元素时,可以使用下面的代码进行操作:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("http://www.forexample.com")
driver.find_element_by_xpath("//*[@id="username"]").click()
8.class_selector
函数find_elements_by_css_selector
cssSelector这种元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持都相当到位,所以功能也是蛮强大的。
下面是一些常见的cssSelector的定位方式:
定位id为flrs的div元素,可以写成:#flrs 注:相当于xpath语法的//div[@id=’flrs’]
定位id为flrs下的a元素,可以写成 #flrs > a 注:相当于xpath语法的//div[@id=’flrs’]/a
定位id为flrs下的href属性值为/forexample/about.html的元素,可以写成: #flrs > a[href=”/forexample/about.html”]
如果需要指定多个属性值时,可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]。
最后再总结一下,各种方式在选择的时候应该怎么选择:
当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。
xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。
当要定位一组元素相同元素时,可以考虑用tagName或name。
当有链接需要定位时,可以考虑linkText或partialLinkText方式。