Use Selenium In Python

本文中主要分享一些关于 Windows 环境下使用 Selenium 来操作 IE11 的一些细节和问题。

Selenium For Python

1. 如何使用 IE

2. 如何重复使用已开启的浏览器回话?

*这是本文的重点之一*。


3. 如何等待一些异步执行的js执行完立即执行?

*这是本文的另一个重点*。

实际使用的过程中,会遇到异步执行的js代码,执行下一步操作需要等待这个js执行完。

在不了解 selenium 的一些特性之前,会想到 time.sleep(?) ,这样确实可以让操作等待;且等待的时间是固定的,无法与dom或者js真正的交互;为了安全只能尽量设置得大一些,这样也白白浪费了时间。 selenium 为我们提供了一些非常友好的 api 来解决这个问题。

  WebDriverWait(_driver, seconds).until(EC.element_to_be_clickable((By.ID, id)))

意思就是:等待若干秒直到某个元素可被点击,则立即返回该元素,超时则抛出相应的异常。 通过这个api可以确保异步或者网络延迟导致dom结构变化的时间在一个范围内,脚本可以按照设计的流程执行下去,并且不消耗多余的等待时间。 使用前,需要导入它们

  from selenium.webdriver.support.ui import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC

更多的相关api可以安装了 selenium 之后在 site-package 中找到它的源代码。

4. 如何确保dom被完全渲染出来了?

判断dom有没有正常的显示可以使用:

  _driver.find_element_by_id(id).is_displayed()

当然这是立即判断,没有等待。 想要等待某个元素显示好了再执行,则需要

  WebDriverWait(_driver, seconds).until(EC.visibility_of_element_located((By.ID, id)))

同样也是用到了 expected_conditions 库中的api。

5. 如何执行单元测试

想要测试 selenium 的脚本,需要先编写一个 html 页面,提供一些dom元素:buttoninputalert 等等,然后通过脚本去控制它们;再使用 python 的 unittest 框架的断言库去测试它们。

6. Bug: 使用之前的浏览器回话,操作 iframe 时会无法在父子框架之间进行正常的切换

如果在一个 frame 中,脚本异常退出,重连之后,无法再次获取到该frame,这个问题暂时没有解决。