Selenium 不仅仅可以用作自动化测试,还有很多种玩法,比如 Python 的爬虫,实现某商品的秒杀,甚至是页游外挂脚本,只要是基于浏览器操作,只有你想不到,没有 Selenium 做不到,就是这么强大!
直奔主题,我们来感受一下 Selenium。
安装
Python 的安装就不再科普,自行百度。
通过 pip 命令安装 Selenium
pip install selenium |
安装浏览器驱动
Selenium 支持的浏览器很多,Firefox、Chrome、IE、Opera 等等。
作为一个程序员,想必大多常用的浏览器都是 Chrome,我的电脑是 Mac,安装 Chrome 浏览器驱动,直接执行 brew cask install chromedriver 即可。
更多 Selenium 浏览器驱动下载,请点击。
示例
先来一段简单的代码。
from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.find_element_by_id('kw').send_keys('php') browser.find_element_by_id('kw').send_keys(Keys.ENTER) |
运行这段代码,你会发现自动打开 Chrome,并访问了百度,在输入框输入了 php,紧接着跳转到了搜索的结果页。
常用方法
1. 页面元素定位
Selenium 常用的元素定位方法
find_element_by_id()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_css_selector()
find_element_by_tag_name()
比如百度页面的 HTML:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
我们可以这样定位
element = driver.find_element_by_id('kw') element = driver.find_element_by_class_name('s_ipt') element = driver.find_element_by_css_selector('.s_ipt') 获取元素之后,就是针对于元素的操作了,简单可以划分两类操作,鼠标事件和键盘事件等等。 |
2. 鼠标操作
element.click() 单击; element.context_click() 右击; element.double_click() 双击; element.drag_and_drop() 拖动; element.move_to_element() 鼠标悬停 |
3. 输入和键盘事件
输入文本:
element.send_keys("Hello world") |
键盘操作:
element.send_keys(Keys.ENTER) 回车 element.send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A) element.send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C) element.send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X) element.send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V) element.send_keys(Keys.F1) 键盘 F1 …… 等等 |
窗口切换
driver.switch_to_window("windowName") |
# 获取所有打开窗口句柄 all_handles = driver.window_handles # 获取当前窗口句柄 current_windows = driver.current_window_handle |
页面等待
现在很多项目都是前后端分离的,HTML 动态渲染,如果我们打开某页面,直接选取元素操作,就会抛出异常,所以设置页面等待是很有必要的。
等待分为两种类型:显式等待和隐式等待。
显式等待: 针对页面的某一元素,每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 5, 0.5).until( EC.presence_of_element_located((By.ID, "kw")) ) element.send_keys('selenium') driver.quit() |
隐式等待:并不针对页面上的某一元素进行等待,脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位,直到超出设置时长,抛出异常。
# 设置隐式等待为10秒 driver.implicitly_wait(10) |
Selenium 还有更多的操作,比如设置浏览器 cookie、文件上传、窗口截图等待,这里就不多介绍了,有兴趣的话,大家可以去看看相关。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。