以下记录刚接触 Python Selenium 操作 web UI 的学习问题:
1.python selenium 三种等待方式:
1强制等待: time.sleep(value): 设置等待最简单的方法就是强制等待, 其实就是 time.sleep()方法, 不管它什么情况, 让程序暂停运行一定时间, 时间过后继续运行; 缺点时不智能, 设置的时间太短, 元素还没有加载出来, 那照样会报错; 设置的时间太长, 则会浪费时间, 不要小瞧每次几秒的时间, case 多了, 代码量大了, 很多个几秒就会影响整体的运行速度了; 所以尽量少用这个
2隐性等待: driver.implicity_wait(value): 隐性等待设置了一个时间, 在一段时间内网页是否加载完成, 如果完成了, 就进行下一步; 在设置的时间内没有加载完成, 则会报超时加载; 缺点也是不智能, 因为随着 Ajax 技术的广泛应用, 页面的元素往往都可以时间局部加载, 也就是在整个页面没有加载完的时候, 可能我们需要的元素已经加载完成了, 那就么有必要再等待整个页面的加载, 执行进行下一步, 而隐性等待满足不了这一点; 另外一点, 隐性等待的设置时全局性的, 在开头设置过之后, 整个的程序运行过程中都会有效, 都会等待页面加载完成; 不需要每次设置一遍;
3显性等待: WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)),selenium 中的 wait 模块的 WebDriverWait()方法, 配合 until 或者 until_not 方法, 再辅助以一些判断条件, 就可以构成这样一个场景: 每经过多少秒就查看一次 locator 的元素是否可见, 如果可见就停止等待, 如果不可见就继续等待直到超过规定的时间后, 报超时异常; 当然也可以判断某元素是否在规定时间内不可见等等的各种场景吧, 需要根据你自己实际的场景选择判断条件;(1)显性等待和隐性等待可以同时使用, 最长等待时间取决于两者之间的大者;(2)WebDriverWait 中的 wait 模块的参数和方法介绍:_init_:
driver: 传入 WebDriver 实例, 即我们上例中的 driver
timeout: 超时时间, 等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 调用 until 或 until_not 中的方法的间隔时间, 默认是 0.5 秒
ignored_exceptions: 忽略的异常, 如果在调用 until 或 until_not 的过程中抛出这个元组中的异常,
则不中断代码, 继续等待, 如果抛出的是这个元组外的异常, 则中断代码, 抛出异常. 默认只有 NoSuchElementException.
until:
method: 在等待期间, 每隔一段时间 (__init__中的 poll_frequency) 调用这个传入的方法, 直到返回值不是 False message: 如果超时, 抛出 TimeoutException, 将 message 传入异常
until_not:
与 until 相反, until 是当某元素出现或什么条件成立则继续执行, until_not 是当某元素消失或什么条件不成立则继续执行, 参数也相同, 不再赘述.
综上, 显性的调用方法就是: WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息), 注意: until 或 until_not 中的可执行方法 method 参数, 需要传入可以调用的参数, 例如 selenium 提供的 excepted_conditions 模块中的各种条件
selenium.webdriver.support.expected_conditions(模块)
以下两个条件类验证 title, 验证传入的参数 title 是否等于或包含于 driver.title
- title_is
- title_contains
以下两个条件验证元素是否出现, 传入的参数都是元组类型的 locator, 如(By.ID, 'kw')
顾名思义, 一个只要一个符合条件的元素加载出来就通过; 另一个必须所有符合条件的元素都加载出来才行
- presence_of_element_located
- presence_of_all_elements_located
以下三个条件验证元素是否可见, 前两个传入参数是元组类型的 locator, 第三个传入 WebElement
第一个和第三个其实质是一样的
- visibility_of_element_located
- invisibility_of_element_located
- visibility_of
以下两个条件判断某段文本是否出现在某元素中, 一个判断元素的 text, 一个判断元素的 value
- text_to_be_present_in_element
- text_to_be_present_in_element_value
以下条件判断 frame 是否可切入, 可传入 locator 元组或者直接传入定位方式: id,name,index 或 WebElement
frame_to_be_available_and_switch_to_it
以下条件判断是否有 alert 出现
alert_is_present
以下条件判断元素是否可点击, 传入 locator
element_to_be_clickable
以下四个条件判断元素是否被选中, 第一个条件传入 WebElement 对象, 第二个传入 locator 元组
第三个传入 WebElement 对象以及状态, 相等返回 True, 否则返回 False
第四个传入 locator 以及状态, 相等返回 True, 否则返回 False
- element_to_be_selected
- element_located_to_be_selected
- element_selection_state_to_be
- element_located_selection_state_to_be
最后一个条件判断一个元素是否仍在 DOM 中, 传入 WebElement 对象, 可以判断页面是否刷新了
staleness_of
上面是所有 17 个 condition, 与 until,until_not 组合能够实现很多判断, 如果能自己灵活封装, 将会大大提高脚本的稳定性.
来源: http://www.bubuko.com/infodetail-2993382.html