一、浏览器
1.操作浏览器的流程:
实例化一个驱动对象-》发送url打开被测页面-》定位元素、操作元素——》设置检查点,检查操作结果。
2.常用浏览器驱动使用:
引用链接:https://blog.youkuaiyun.com/VXadmin/article/details/89433821
Chrome:chromedriver.exe # 驱动下载链接:https://sites.google.com/a/chromium.org/chromedriver/home
Firefox:geckodriver.exe # 驱动下载链接:https://github.com/mozilla/geckodriver/releases
Edge:msedgedriver.exe # 驱动下载链接:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver
IE:IEDriverServer.exe # 驱动下载链接:http://selenium-release.storage.googleapis.com/index.html
驱动实例化:
driver = webdriver.Chrome() # Chrome浏览器
driver = webdriver.Firefox() # Firefox浏览器
driver = webdriver.Edge() # Edge浏览器
driver = webdriver.Ie() # Internet Explorer浏览器
3.元素定位:
3.1 语法
from selenium.webdriver.common.by import By
driver.find_element(By.*,value)
ID = “id”
XPATH = “xpath”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
NAME = “name”
TAG_NAME = “tag name”
CLASS_NAME = “class name”
CSS_SELECTOR = “css selector”
3.2 常见元素定位方法
3.2.1 下拉框
from selenium.webdriver.support.ui import Select
# 定位该下拉框
Select=driver.find_element_by_id('下拉框的id')
# 转换成下拉框格式,然后通过index方式选择
Select(Select).select_by_index(第几个选项')
# 转换成下拉框格式,然后通过value方式选择
Select(Select).select_by_value(value)
# 转换成下拉框格式,然后通过可见文本方式选择
Select(Select).select_by_visible_text('山西省')
3.2.2 单选按钮
#定位某个单选按钮,用click选定
driver.find_element_by_css_selector('[value="1"]').click()
3.2.3 时间控件
#日期控件可能加readonly属性,只能读取,需先删除readonly属性,才能输入日期,selenium无法删除属性,用Javascript代码,通过script脚本方式执行。
script = 'document.getElementById("date").removeAttribute("readonly")'
driver.execute_script(script)
# 删除readonly属性,日期控件可输入,先清空默认值
driver.find_element_by_id("date").clear()
# 在日期控件输入测试值
driver.find_element_by_id("date").send_keys("1980-02-02")
3.2.4 文件上传
真正负责上传文件的控件是<input type="file" ...>
#找到上传图片或者文件的地方,点击打开上传文件页面
driver.find_element_by_link_text("商品图册").click()
# 定位正真负责上传文件的HTML控件位置(有inputtype=file属性),发送需要上传图片/文件的绝对路径。
driver.find_element_by_name("file").send_keys("D:/quekou.png")
4.元素常用操作方法:
*.click()
*.send_keys("*") # 追加写,不会清除原有字符
*.clear()
*.submit()
*.text # 获取控件文本信息
driver.current_url # 获取驱动当前url
5.焦点切换:
5.1 切换浏览器窗口
driver.windows_handles[-1] # 获取浏览器新打开窗口句柄
driver.switch_to.window(new_window)
5.2切换弹出窗:
driver.switch_to.alert(.accept()、.dismiss()、text())
5.3切换Frame
元素存在却定位不到,原因一个网页有多个HTML嵌套而成,需先切换到对应的HTML才能操作该HTML中的元素,将鼠标移动元素所在html代码body部分,未包含该网页全部,则存在页面嵌套。
#(1)iframe设置了id或者name属性值(switch_to.frame()默认支持id或者name方法定位)
driver.switch_to.frame('id或者name属性值')
#(2)未设置id或者name属性值,需要先定位框架(支持八种定位方法),再切换。
iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(iframe)
6显示等待:
参考文章:https://blog.youkuaiyun.com/dghrty_show/article/details/105061086
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element=WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None).until(EC.method,message="")
WebDriverWait()参数说明:
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
message:错误提示信息
until()/until_not():
#调用该方法提供的驱动程序作为参数,直到返回值为True
WebDriverWait(driver,10).until(method,message="")
#调用该方法提供的驱动程序作为参数,直到返回值为False
WebDriverWait(driver,10).until_not(method,message="")
常用method:
#判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0)
visibility_of_element_located
#判断元素是否出现
presence_of_element_located
#判断某个元素中是否可见并且可点击
element_to_be_clickable
#判断页面上是否存在 alert
alert_is_present
#判断某个元素是否被选中了,一般用在下拉列表
element_to_be_selected
7 键盘操作:
from selenium.webdriver.common.keys import Keys
driver.find_element(By.*,value).send_keys('上海',Keys.DOWN,Keys.ENTER)
说明:send_keys()支持传入多个参数,传入“键盘按键”时相当于在键盘上点击该按键,传入多个依次点击。
8.断言
8.1思路
操作后刷新页面新出现元素是否可以检测到
操作后有URL变化的,可以通过URL判断,获取当前URL:result = self.driver.current_url
操作后之前页元素是否不可见
8.2写if语句判断
8.3 assert方法
selenium自带类库
方式一:
# 断言a和b是否相等,相等则测试用例通过。
assertEqual(a,b,[msg='测试失败时打印的信息'])
#断言a和b是否相等,不相等则测试用例通过。
assertNotEqual(a,b,[msg='测试失败时打印的信息'])
#断言a是否在b中,在b中则测试用例通过。
assertIn(a,b,[msg='测试失败时打印的信息'])
#断言a是否在b中,不在b中则测试用例通过。
assertNotIn(a,b,[msg='测试失败时打印的信息'])
方式二:
# 断言标题包含
assert '百度新闻' in dr.title
8.4 try except else
try:存放测试代码
except:
try中代码运行产生异常时,执行except模块,except可以有多个(但只执行其中一个),每个都可以处理一种或者多种异常(例:except (IndexError, ValueError, ArithmeticError):)。
所有的异常对象都包含了几个常用属性和方法,可以通过as为异常对象声明变量,来访问异常对象的相关信息:
args:该属性返回异常的错误编号和描述字符串。
errno:该属性返回异常的错误编号。
strerror:该属性返回异常的描述宇符串。
with_traceback():通过该方法可处理异常的传播轨迹信息。
def foo():
try:
fis = open("a.txt");
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
# 访问异常的错误编号
print(e.errno)
# 访问异常的详细信息
print(e.strerror)
else:
print("123")
else:无论是否异常都执行的代码