web端的UI 自动化
原理
webdriver是按照server – client的经典设计模式设计的。
server端就是remote server,可以是任意的浏览器(如chrome.exe)。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client发送请求并做出相应;
client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被 测试浏览器,也就是remote server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;
引入库
#coding=utf-8
from selenium import webdriver #基础库
from selenium.webdriver.common.action_chains import ActionChains #鼠标操作使用库
from selenium.webdriver.common.keys impoet Keys #键盘操作使用库
import time #time包
import os #上传文件需要的包
详解
一、浏览器基础操作
#coding=utf-8
from selenium import webdriver
driver = webdriver.Edge() #打开edge(重命名为“MicrosoftWebDriver.exe”)浏览器,这个exe需要放在python.exe同目录下
url = 'https://www.baidu.com/'
driver.get(url) #浏览器输入网址,并回车效果
driver.maximize_window() #最大化浏览器
driver.set_window_size(480,800) #设置浏览器宽480、高800
driver.back() #浏览器后退(等同于浏览器左上角的“<-”)
driver.forward() #浏览器前进(等同于浏览器左上角的“->”)
driver.quit() #关闭浏览器
二、简单对象的定位
id -------> driver.find_element_by_id()
name -------> driver.find_element_by_name()
class name -------> driver.find_element_by_class_name()
tag name -------> driver.find_element_by_tag_name()
css selector -------> driver.find_element_by_css_selector()
xpath -------> driver.find_element_by_xpath()
link text -------> driver.find_element_by_link_text()
partial link text -------> driver.find_element_by_partial_link_text()
注:浏览器F12打开开发者模式,选择元素后,右【Copy Xpath】,如下所示:
三、操作测试对象
- clear 清除元素的内容 driver.find_element_by_id(‘user’).clear()
- send_keys 在元素上模拟按键输入 driver.find_element_by_id(‘user’).send_keys(‘user_name’)
- click 单击元素 driver.find_element_by_id(“user”).click()
- submit 提交表单 driver.find_element_by_id(“user”).submit()
- size 返回元素的尺寸 size = driver.find_element_by_id(‘user’).size
- text 获取元素的文本 text = drier.find_element_by_id(‘user’).text
- get_attibute(name) 获取属性值 attribute = driver.find_element_by_id(‘user’).get_attribute(‘type’)
- is_displayed() 返回元素的结果是否可见 res = driver.find_element_by_id(‘user’).is_dispalyed()
四、鼠标事件
ActionChains 类鼠标操作的常用方法
- context_click() 右击 ActionChains(driver).context_click(element.perform()
- double_click() 双击 ActionChains(driver).double_click(element).perform()
- drag_and_drop() 拖动 ActionChains(driver).drag_and_drop(element,target).perform()
- move_to_element() 鼠标悬停在一个元素上
- click_and_hold() 按下鼠标左键在一个元素上
注: element = driver.find_element_by_id(‘user’)
target = driver.find_element_by_id(‘password’)
五、键盘事件
Keys类键盘操作常用的方法
- send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
- send_keys(Keys.SPACE) 空格键(Space)
- send_keys(Keys.TAB) 制表键(Tab)
- send_keys(Keys.ESCAPE) 回退键(Esc)
- send_keys(Keys.ENTER) 回车键(Enter)
- send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
- send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
- send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
- send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
例:driver.find_element_by_id(‘user’).send_keys(Keys.ENTER)
六、设置等待时间
- time.sleep(60) #固定休眠60秒
- driver.implicitly_wait(60) #全局使用,设置1次,找不到元素时,最长等待时间(60秒),如果发现不必强制等待直接进行下一条语句
- element = WebDriverWait(driver,10).until(lambda driver:driver.find_element_by_id(‘user’))
element.send_keys(‘selenium’)
说明:
WebDriverWait(driver,timeout,poll_frequency=0.5,igbored_exceptions=None)
–timeout 最长超时时间 --poll_frequency 休眠时间的间隔(步长) --ignored_exceptions 超长后的异常提示信息,默认NoSuchElementException
WebDriverWait(driver,10,0.5,‘超时异常报错’) #在10秒内每0.5秒检测一次,不满足则给出提示信息“超时异常报错”
搭配until() 或 until_not()方法使用
七、定位frame中的对象
遇到frame嵌套,切换frame后,才能定位到对应frame中的元素
switch_to_frame
八、对话框处理
九、alert/confirm/prompt处理
alert = driver.switch_to_alert() #首先,获取网页的警告信息
- text = alter.text() #获取弹窗中的文本信息
- alert.accept() #接收警告信息,点击【确认】
- alert.dismiss() #取消对话框,点击【取消】
- alert.send_keys(‘输入值’), #输入值
十、上传文件
- driver.find_element_by_id(‘user’).send_keys(‘D:\upload_file.txt’) #点击【上传】按钮,添加本地文件
十一、控制浏览器滚动条
- 滚动到顶部
js = "var q=document.documentElement.scrollTop=0“
driver.execute_script(js) - 滚动到底部
js = "var q=document.documentElement.scrollTop=10000“
driver.execute_script(js)