元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素。
webdriver提供了一系列的元素定位方法,常用的有以下几种:
- id
- name
- class name
- tag
- link text
- partial link text
- xpath
- css selector
案例:打开百度首页,在搜索框自动输入“Selenium”关键词,然后点击搜索按钮,查看搜索页面
在此之前,首先使用前端工具查看百度首页的元素,可以查看到各种标签对、标签属性、标签对之间的文本数据以及层级关系等,如下所示:
<span class="bg s_ipt_wr quickdelete-wrap"> <span class="soutu-btn"></span> <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd"> <a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"></a> </span> <span class="bg s_btn_wr"> <input id="su" class="bg s_btn" type="submit" value="百度一下"> </span>
id定位
from selenium import webdriver from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") sleep(2) driver.find_element_by_id("su").click() sleep(3) driver.quit()
HTML规定id属性在HTML文档中必须是唯一的,Webdriver提供的id定位方法就是通过元素的id属性来查找元素。
name定位
driver.find_element_by_name("wd").send_keys("selenium")
HTML规定name来置顶元素的名称,name的属性值,在当前页面中可以不唯一。
calss定位
driver.find_element_by_class_name("s_ipt").send_keys("selenium")
HTML规定class来置顶元素的类名,其用法与id、name类似。
tag定位
案例:打开博客园首页页面,在找找看的搜索输入框输入关键词“selenium”,休息3秒后,在Google前面的搜索框输入“selenium”关键词
from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get("https://www.cnblogs.com") #定位标签名为input的元素,默认是第一个 driver.find_element_by_tag_name("input").send_keys("Selenium") sleep(3) #获取页面所有标签名为“input”的标签 driver.find_elements_by_tag_name("input")[1].send_keys("Selenium") sleep(3) driver.quit()
HTML的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag。因为一个tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低,很难通过标签tag name去区分不同的元素
link定位
案例:打开百度首页的新闻页面
此时,使用前端工具查看到的页面代码如下:
<div id="u1"> <a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a> <a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a> <a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a> <a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a> <a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧</a> <a class="mnav" name="tj_trxueshu" href="http://xueshu.baidu.com">学术</a> <a class="lb" onclick="return false;" name="tj_login" href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F">登录</a> <a class="pf" name="tj_settingicon" href="http://www.baidu.com/gaoji/preferences.html">设置</a> <a class="bri" style="display: block;" name="tj_briicon" href="http://www.baidu.com/more/">更多产品</a> </div>
Python代码:
driver.find_element_by_link_text("新闻").click()
find_element_by_link_text()方法通过元素标签对之间的文本信息来定位元素
Partial link定位
driver.find_element_by_partial_link_text('党的十九大精神').click()
partial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一的标识这个链接