最近写项目的时候,用到了Selenium,一个 Web 端的自动化测试工具,直接运行在浏览器中,用来模拟用户操做。php
Selenium 不单单能够用做自动化测试,还有不少种玩法,好比 Python 的爬虫,实现某商品的秒杀,甚至是页游外挂脚本,只要是基于浏览器操做,只有你想不到,没有 Selenium 作不到,就是这么强大!css
直奔主题,咱们来感觉一下 Selenium。html
Python 的安装就再也不科普,自行百度。python
经过 pip 命令安装 Selenium程序员
pip install selenium
Selenium 支持的浏览器不少,Firefox、Chrome、IE、Opera 等等。web
做为一个程序员,想必大多经常使用的浏览器都是 Chrome,个人电脑是 Mac,安装 Chrome 浏览器驱动,直接执行 brew cask install chromedriver
便可。chrome
更多 Selenium 浏览器驱动下载,请点击。windows
先来一段简单的代码。后端
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,紧接着跳转到了搜索的结果页。api
Selenium 经常使用的元素定位方法
好比百度页面的 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')
获取元素以后,就是针对于元素的操做了,简单能够划分两类操做,鼠标事件和键盘事件等等。
element.click() 单击; element.context_click() 右击; element.double_click() 双击; element.drag_and_drop() 拖动; element.move_to_element() 鼠标悬停
输入文本:
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、文件上传、窗口截图等待,这里就很少介绍了,有兴趣的话,你们能够去看扩展阅读。
女票再让我帮她秒杀商品,不再用傻傻等待,分分钟用 Selenium 写个秒杀应用有木有!:)