selenium+pytest笔记

Selenium

记录一些我学习时候的内容(也不知道哪些是重点!ORZ)

1. Selenium原理

我们调用selenium客户端库的函数,发送给浏览器驱动webdriver,执行点击之类的命令,返回结果进行处理。

  • 使用 WebDriver 的 get 方法打开网址。
  • 关闭浏览器窗口可以调用WebDriver对象的 quit 方法,如 wd.quit()
  • 输入字符串使用 send_keys 方法。
  • 清除内容,可以使用WebElement对象的 clear 方法。
  • 使用 get_attribute 方法来获取元素的属性值,例如获取输入框里面的文字 element.get_attribute('value')

2. 选择元素的方法

可以通过 idclass 属性、tag 名来选择元素。

3. find_elementfind_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_moduleteardown_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 代替 returnyield 后面的代码就是清除部分的代码。

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 函数,然后传给用例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值