Selenium
记录一些我学习时候的内容(也不知道哪些是重点!ORZ)
1. Selenium原理
我们调用selenium客户端库的函数,发送给浏览器驱动webdriver,执行点击之类的命令,返回结果进行处理。
- 使用 WebDriver 的
get方法打开网址。 - 关闭浏览器窗口可以调用WebDriver对象的
quit方法,如wd.quit()。 - 输入字符串使用
send_keys方法。 - 清除内容,可以使用WebElement对象的
clear方法。 - 使用
get_attribute方法来获取元素的属性值,例如获取输入框里面的文字element.get_attribute('value')。
2. 选择元素的方法
可以通过 id、class 属性、tag 名来选择元素。
3. find_element 和 find_elements 的区别
- 使用
find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,返回空列表。 - 使用
find_element选择的是符合条件的第一个元素,如果没有符合条件的元素,抛出NoSuchElementException异常。
4. implicitly_wait(10)
可以称之为隐式等待,或者全局等待,十秒后没找到会报错。有些时候打开一个网页没加载出来就会报错,所以要用这个。
5. CSS Selector
同样可以根据 tag 名、id 属性和 class 属性来选择元素。
- 根据
tag名选择元素的 CSS Selector 语法非常简单,直接写上tag名即可。 - 根据
id属性选择元素的语法是在id号前面加上一个井号:#id值。 - 根据
class属性选择元素的语法是在class值前面加上一个点:.class值。 - CSS 选择器支持通过任何属性来选择元素,语法是用一个方括号
[]。 - 可以指定选择的元素是父元素的第几个子节点,使用
nth-child。 - 可以指定选择的元素是父元素的第几个某类型的子节点,使用
nth-of-type。 - 如果要选择的是父元素的某类型偶数节点,使用
nth-of-type(even)。 - 如果要选择的是父元素的某类型奇数节点,使用
nth-of-type(odd)。 - 相邻兄弟关系,可以这样写
h3 + span;如果要选择h3后面所有的兄弟节点span,可以这样写h3 ~ span。
6. CSS Selector 选择子元素和后代元素
- 如果元素2是元素1的直接子元素,CSS Selector 选择子元素的语法是:元素1 > 元素2。
- 如果元素2是元素1的后代元素,CSS Selector 选择后代元素的语法是:元素1 元素2。
7. 窗口和框架切换
wd.switch_to.frame('innerFrame')切换到指定框架,切换回原来的主 html:wd.switch_to.default_content()。- 新的窗口:
for handle in wd.window_handles:
# 先切换到该窗口
wd.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if 'Bing' in wd.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环
break
8. 选择框操作
常见的选择框包括:radio 框、checkbox 框、select 框。
radio框和checkbox,直接用 WebElement 的click方法,模拟用户点击。
# 先把已经选中的选项全部点击一下,确保都是未选状态
# 先找到对应的元素框
elements = wd.find_elements(By.CSS_SELECTOR, '#s_checkbox input[name="teacher"]:checked')
# 把已经选中的选项全部点击一下
for element in elements:
element.click()
# 再点击对应元素
wd.find_element(By.CSS_SELECTOR, "#s_checkbox input[value='小雷老师']").click()
select框 Selenium 专门提供了一个Select类进行操作:select_by_value:根据选项的value属性值,选择元素。select_by_index:根据选项的次序(从 0 开始),选择元素。select_by_visible_text:根据选项的可见文本,选择元素。
9. Selenium 提供的 ActionChains 类
小问题:怎么定位没法选中的元素?
# 1. 鼠标移动到元素上
ac = ActionChains(driver)
ac.move_to_element(driver.find_element(By.CSS_SELECTOR, '[name="tj_briicon"]')).perform()
冻结界面
在开发者工具栏 console 里面执行如下 js 代码:setTimeout(function(){debugger}, 5000)
10. Alert 弹出框
driver.switch_to.alert.accept():代码模拟用户点击 OK 按钮。driver.switch_to.alert.text:获取弹出对话框中的信息内容。Confirm弹出框:driver.switch_to.alert.dismiss()。Prompt弹出框:driver.switch_to.alert.send_keys()。
11. 其他技巧
- 获取窗口大小:
driver.get_window_size()。 - 改变窗口大小:
driver.set_window_size(x, y)。 - 获取当前窗口的标题栏字符串:
driver.title。 - 获取当前窗口 URL 地址:
driver.current_url。 - 截屏:使用 WebDriver 的
get_screenshot_as_file方法,如driver.get_screenshot_as_file('1.png')。 - 文件上传:
send_keys方法传入要上传的文件路径,如ele.send_keys(r'h:\g02.png')。
12. Xpath 选择
/html/body/div,就是一个绝对路径的 xpath 表达式,等价于 css 表达式html>body>div。- 相对路径选择:
//div。 - 通配符:要选择所有
div节点的所有直接子节点,可以使用表达式//div/*。 - 要在某个元素内部使用 xpath 选择元素,需要在 xpath 表达式最前面加个点,如
elements = china.find_elements(By.XPATH, './/p')。
Pytest
1. 测试用例编写
测试用例用 assert 断言来写。
2. 运行测试用例
打开命令行窗口,进入自动化项目根目录,执行命令程序 pytest 即可。
3. 初始化清除
模块级别
初始化、清除使用全局函数 setup_module 和 teardown_module。
类级别
@classmethod
def setup_class(cls):
print('\n === 初始化-类 ===')
@classmethod
def teardown_class(cls):
print('\n === 清除 - 类 ===')
方法级别
def setup_method(self):
print('\n --- 初始化-方法 ---')
def teardown_method(self):
print('\n --- 清除 -方法 ---')
fixture
测试方法需要那个初始化清除,就在参数里面声明它,参数名和 fixture 函数同名,就会自动执行它,中文称之为:依赖注入。最推荐的使用 yield 代替 return,yield 后面的代码就是清除部分的代码。
4. 指定执行测试用例
- 指定一个模块执行测试用例:
python -m pytest cases\登录\test_错误登录.py。 - 只挑选一个目录执行,也可以指定多个目录。
- 指定一个类:
python -m pytest cases\登录\test_错误登录.py::Test_错误密码。 - 指定类里面的方法:
python -m pytest cases\登录\test_错误登录.py::Test_错误密码::test_C001001。 - 使用命令行参数
-k后面加名字来挑选要执行的测试项:python -m pytest -k C001001 -s。 - 给某个方法加上标签
webtest:
@pytest.mark.webtest
def test_C001021(self):
print('\n用例C001021')
assert 1 == 1
执行命令:python -m pytest cases -m webtest -s
5. parametrize 装饰器
@pytest.mark.parametrize("createUser", [("zhangsan", "111")], indirect=True)
传给 @pytest.fixture 函数,然后传给用例。
2670

被折叠的 条评论
为什么被折叠?



