Selenium webdriver能够模拟人对浏览器进行操作的前提是界面元素的定位。元素的定位可以说是Selenium自动化脚本的基础。这一小节笔者将介绍如何在selenium中进行元素的定位。
定位元素的方法
Selenium中提供了以下定位元素的方法:
首先看一个HTML文件 test_page.:
1. id
通过元素的id
来完成username输入框的定位。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by id
dr.find_element(:id, 'input username').click
2.name
通过元素的name
属性来完成对username输入框的定位。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by name
dr.find_element(:name, 'username').click
3. class name
通过元素的class
属性来完成对username输入框的定位。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by name
dr.find_element(:class, 'input').click
4. link text和partial link text
通过链接元素的text属性来完成Home Page链接的定位。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by link_text
link_text = dr.find_element(:link_text, 'Home Page').get_text
puts link_text
# by partial_link_text
link_text = dr.find_element(:partial_link_text, 'Home').get_text
puts link_text
5. tag name
通过标签的name来完成header元素的定位
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by tag name
header_text = dr.find_element(:tag_name, 'h3').get_text
puts header_text
6. xpath
xpath是用来定位HTML文档中元素的通用方法,有一套自己的语法规则,支持各种函数,可以说是一种最全面的定位方法。我在开发Selenium自动化用例的过程中,最多使用的就是xpath。
这里只用简单的例子说明xpath的定位使用,具体的xpath的使用将在另外的专题中介绍。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by xpath
dr.find_element(:xpath, "//tr/td/input[@value='women']").click
7. css selector
css selector和xpath一样,也是功能非常强大的定位方法。但是与xpath不同,css selector只能支持向后定位,而xpath可以支持向前和向后定位。
下面的例子讲展示如何用css selector定位xpath例子中的同一个元素。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# by css selector
dr.find_element(:css, "tr>td>input[value='women']").click
定位一组元素
Selenium中支持同时获取一组元素的定位,这在处理多选项选择,或者表格元素的时候非常有用。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
dr.get "http://test.html"
# Get number of items
num_of_tds = dr.find_elements(:tag_name, "td").count