015-WebDriver API
1. 从定位元素开始
8种元素定位方法
id find_element_by_id( ) name find_element_by_name( ) tag find_element_by_tag_name( ) class find_element_by_class_name( ) link_text find_element_by_link_text( ) partial_link find_element_by_partial_link_text( ) XPath find_element_by_xpath( ) CSS_selector find_element_by_css_selector( )
关于selenium元素定位如何验证属性的唯一性
快捷键F12,切换到Console,按下快捷键crtl+L:清空console内容
在console的输入栏,用Css的语法$$(“标签[属性='属性值']”)
在console的输入栏,用Xpath的语法$x("//*[@属性='属性值']")
length:1-->表示元素的属性对应的属性值是唯一的
length:2-->表示元素的属性对应的属性值不唯一
XPath 定位
1. 绝对路径定位
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
2. 利用元素属性定位
使用元素的属性来定位,//input表示当前页面某个input标签
find_element_by_xpath("//input[@id='kw']")
如果不想指定标签名,可以使用星号(*)代替
find_element_by_xpath("//*[@id='kw']")
使用xpath不局限于id、name、和class这三个属性,元素的任意属性都可以使用,只要它能唯一标识一个元素
find_element_by_xpath("//input[@autocomplete='off']") find_element_by_xpath("//input[@type='submit']")
3. 层级与属性结合
如果一个元素本身没有可以唯一标识这个元素的属性,那么我们可以查找上一级元素。如果它的上一级元素有可以唯一标识属性的值,可以拿来使用
find_element_by_xpath("//form[@id='form']/span/input")
4. 使用逻辑运算符
如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来查找元素
find_element_by_xpath("//input[@id='kw'and @class='s_ipt']")
CSS定位
1. 通过class定位
点号(.)表示通过class来定位元素
find_element_by_css_selector(".s_ipt")
2. 通过id定位
井号(#)表示通过id来定位元素
driver.find_element_by_css_selector("#kw")
3. 通过属性定位
在CSS中可以使用元素的任意属性定位,只要这些属性可以唯一标识这个元素
driver.find_element_by_css_selector("[name ='wd']") driver.find_element_by_css_selector("[autocomplete='off']")
4. 通过标签名定位
在CSS中,用标签名定位元素时不需要任何符号标识,直接使用标签名即可
find_element_by_css_selector("input")
5. 通过标签层级关系定位
这种写法表示有父元素,父元素的标签名为span。查找span中所有标签名为input的子元素
find_element_by_css_selector("span > input")
6. 组合定位
把上面的定位策略组合起来使用,大大加强了定位元素的唯一性
driver.find_element_by_css_selector("form.fm > span > input#su").click()
7. 更多定位用法
find_element_by_css_selector("[class*=s_ipt_wr]")
查找class属性包含“s_ipt_wr”字符串的元素
find_element_by_css_selector("[class^=bg]")
查找class属性中以“bg”字符串开头的元素
find_element_by_css_selector("[class$=wrap]")
查找class属性中以“wrp”字符串结尾的元素
find_element_by_css_selector("form > input:nth-child(2)")
查找form标签下面第2个input标签的元素
用By元素定位
使用By之前需要先导入
from selenium.webdriver.common.by import By
WebDriver 还提供了find_element( )方法定位元素,它需要两个参数。第一个参数是定位类型,由By提供;第二个参数是定位的值
driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.NAME, "wd").send_keys("selenium") driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("selenium") driver.find_element(By.TAG_NAME, "input") driver.find_element(By.LINK_TEXT, "新闻") driver.find_element(By.PARTIAL_LINK_TEXT, "新") driver.find_element(By.XPATH, "//input[@name = 'wd']").send_keys("selenium") driver.find_element(By.CSS_SELECTOR, ".s_ipt").send_keys("selenium")
2. 控制浏览器
设置窗口大小
driver.set_window_size(400,800)
设置全屏
driver.maximize_window()
后退
driver.back()
前进
driver.forward()
刷新
driver.refresh()
3. webdrdiver中的常用方法
1. clear( )
清除文本
2. send_keys(value)
模拟按键输入
3. click( )
单击元素
4. submit( )
提交表单
有些输入框不提供搜索按钮,而是通过键盘上的回车键完成搜索内容的提交,这是我们可以使用submit模拟
from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") search_text = driver.find_element_by_id("kw") search_text.send_keys("selenium") # 提交 search_text.submit()
5. size
返回元素的尺寸
6. text
获取元素的文本
7. get_attribute(name)
获取属性值
8. is_displayed( )
设置该元素是否用户可见
4. 鼠标操作
ActionChains
引入ActionChains类
from selenium.webdriver import ActionChains
ActionChains 提供的方法
click(on_element=None) #单击鼠标左键 click_and_hold(on_element=None) #点击鼠标左键,按住不放 context_click(on_element=None) #点击鼠标右键 double_click(on_element=None) #双击鼠标左键 drag_and_drop(source, target) #拖拽到某个元素然后松开 drag_and_drop_by_offset(source, xoffset, yoffset) #拖拽到某个坐标然后松开 move_by_offset(xoffset, yoffset) #鼠标移动到距离当前位置(x,y) move_to_element(to_element) #鼠标移动到某个元素 move_to_element_with_offset(to_element, xoffset, yoffset) #将鼠标移动到距某个元素多少距离的位置 release(on_element=None) #在某个元素位置松开鼠标左键 perform() #执行链中的所有动作
move_to_element( ):鼠标悬停
from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.Chrome() driver.get("http://www.baidu.com") above = driver.find_element_by_link_text("设置") action = ActionChains(driver) # 对定位到的元素进行鼠标悬停操作 action.move_to_element(above).perform()
TouchActions
引入TouchActions类
from selenium.webdriver.common.touch_actions import TouchActions
TouchAction提供的方法
double_tap(on_element) #双击 flick_element(on_element, xoffset, yoffset, speed) #从元素开始以指定的速度移动 long_press(on_element) #长按不释放 move(xcoord, ycoord) #移动到指定的位置 perform() #执行链中的所有动作 release(xcoord, ycoord) #在某个位置松开操作 scroll(xoffset, yoffset) #滚动到某个位置 scroll_from_element(on_element, xoffset, yoffset) #从某元素开始滚动到某个位置 tap(on_element) #单击 tap_and_hold(xcoord, ycoord) #某点按住
5. 键盘操作
导入Keys类
from selenium.webdriver.common.keys import Keys
常用键盘操作
send_keys(Keys.BACK_SPACE):删除键 send_keys(Keys.SPACE):空格键 send_keys(Keys.ESCAPE):回退键 send_keys(Keys.ENTER):回车键 send_keys(Keys.CONTROL, "a"):全选 send_keys(Keys.CONTROL, "c"):复制 send_keys(Keys.CONTROL, "x"):剪切 send_keys(Keys.CONTROL, "v"):粘贴
6. 常用的几种验证信息
title:用于获取当前页面的标题
current_url:用于获取当前页面的URL
text:用于获取当前页面的文本信息
一百度搜索为例,对比搜索前后的信息差异,这些差异信息可以拿来作为自动化测试的断言点
7.设置元素等待
1. 显示等待WebDriver,具体格式如下:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exception=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5秒
ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常
WebDriverWait()一般与until()或until_not()方法配合使用
presence_of_element_located() 判断元素是否存在,由 expected_conditions 类提供
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") try: element = WebDriverWait(driver, 2, 0.5).until(EC.presence_of_element_located((By.ID, '1kw'))) element.send_keys('selenium') finally: driver.quit()
2. 使用is_displayed( )方法实现元素显示等待
from time import sleep,ctime from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") print(ctime()) for i in range(5): try: e1 = driver.find_element_by_id("kw12") if e1.is_displayed(): break except: sleep(1) else: print("time out") print(ctime()) driver.quit()
3.隐式等待implictily_wait()
from time import ctime from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Chrome() driver.implicitly_wait(5) driver.get("http://www.baidu.com") try: print(ctime()) driver.find_element_by_id("kw123").send_keys("selenium") except NoSuchElementException as e: print(e) finally: print(ctime()) driver.quit()
4.三种等待方式的区别:
1.selenium的显示等待
原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.(简而言之:就是直到元素出现才去操作,如果超时则报异常)
2.selenium的隐式等待
原理:隐式等待,就是在创建driver时,为浏览器对象设置一个等待时间。这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素
3.sleep()等待
使当前线程进入等待,如果使用Thread.sleep()方法,这种等待属于死等,很容易让线程挂掉,使程序抛异常,所以我们要慎用此方法
8. 定位一组元素
8种定位一组元素的方法
find_elements_by_id( )
find_elements_by_name( )
find_elements_by_tag_name( )
find_elements_by_class_name( )
find_elements_by_link_text( )
find_elements_by_partial_link_text( )
find_elements_by_xpath( )
find_elements_by_css_selector( )