Selenium WebUI自动化测试二:页面操作常用方法

1.CSS选择器

1.调试方法

  • 进入浏览器的console
  • 输入:
    • $(“css表达式”)
    • 或者$$(“css表达式”)
      |类|.class属性值|
      | — | — |
      |ID|#id属性值|
      |属性|类[属性名=“属性值”]|

2.在console中的写法

//标签名 $('input') //.类属性值 $('.s_ipt') //#id属性值 $('#kw') //[属性名='属性值'] $('[name="wd"]')

3.关系定位

类型 格式
并集 元素,元素
邻近兄弟(了解即可) 元素+元素
兄弟(了解即可) 元素1~元素2
父子 元素>元素
后代 元素 元素
父子关系+顺序 元素 元素
父子关系+标签类型+顺序 元素 元素
在console中的写法
//元素,元素
$('.bg,.s_ipt_wr,.new-pmd,.quickdelete-wrap')
//元素+元素,了解即可
$('.soutu-btn+input')
//元素1~元素2,了解即可
$('.soutu-btn~i')
//元素>元素
$('#s_kw_wrap>input')
//元素 元素
$('#form input')
//:nth-child(n)   input元素父集的第几个孩子
$('#form>input:nth-child(2)')
//:nth-of-type(n) 父集下子集input类型的第几个 
$('#form>input:nth-of-type(1)')

2.xpath定位

1.xpath 定位的调试方法

  • 浏览器-console定位方法
    • $x(“xpath表达式”)
  • 浏览器-elements
    • ctrl+f 输入Xpath或者css

2.基础语法

表达式 结果
/ 从该节点的子元素选取
// 从该节点的子孙元素选取
* 通配符
nodename 选取此节点的所有子节点
选取当前节点的父节点
@ 选取属性
# 整个页面
$x("/")
# 页面中的所有的子元素
$x("/*")
# 整个页面中的所有元素
$x("//*")
# 查找页面上面所有的div标签节点
$x("//div")
# 查找id属性为site-logo的节点
$x('//*[@id="site-logo"]')
# 查找节点的父节点
$x('//*[@id="site-logo"]/..')
# 获取此节点下的所有的li元素
$x("//*[@id='ember21']//li")
# 获取此节点下【所有的节点的】第一个li元素
$x("//*[@id='ember21']//li[1]")

3.高级用法
[last()]: 选取最后一个
[@属性名=‘属性值’ and @属性名=‘属性值’]: 与关系
[@属性名=‘属性值’ or @属性名=‘属性值’]: 或关系
[text()=‘文本信息’]: 根据文本信息定位
[contains(text(),‘文本信息’)]: 根据文本信息包含定位
注意:所有的表达式需要和 [ ]结合

# 选取最后一个input标签
//input[last()]
# 选取属性name的值为passward并且属性pwd的值为123456的input标签
//input[@name='passward' and @pwd='123456']
# 选取属性name的值为passward或属性pwd的值为123456的input标签
//input[@name='passward' or @pwd='123456']
# 选取所有文本信息为'霍格沃兹测试开发'的元素
//*[text()='霍格沃兹测试开发']
# 选取所有文本信息包'霍格沃兹'的元素
//*[contains(text(),'霍格沃兹')]

3.网页frames

要定位一个元素时,怎么都定位不到的时候就要考虑是不是浏览器内嵌了一个 frame 窗口或者要找的元素在新打开的窗口里。这时候就需要进行 frame 的切换或者窗口的切换。

<iframe src="1.html" id="hogwarts_id" name="hogwarts_name"></iframe>

通过传入id、name、index以及selenium的WebElement对象来切换frame:

# index:传入整型的参数,从 0 开始,这里的 0 就是第一个 frame
driver.switch_to.frame(0)
#id:iframe 的 id
driver.switch_to.frame("hogwarts_id")
#name: iframe 的 name
driver.switch_to.frame("hogwarts_name")
#WebElement: 传入 `selenium.webelement` 对象
driver.switch_to.frame(driver.find_element(By.TAG_NAME,"iframe"))
切换回原页面
driver.switch_to.default_content()

多层切换

image

如图所示多层嵌套的 iframe。 从最外部 iframe 切换到 iframe2 则需要层层切换:

driver.switch_to.frame("iframe1") 
driver.switch_to.frame("iframe2")

从 iframe2 切换回 iframe1 可以使用父子切换:

# 从 iframe2 切换到上一级 iframe1 
driver.switch_to.parent_frame() 
# 从 iframe1 切换到上一级 iframe,如果 iframe 已经是最上级,则保持不变 
driver.switch_to.parent_frame()