分享一个神器,Selenium 自动化测试工具
122

来社区冒个泡 :laughing:

最近写项目的时候,用到了Selenium,一个 Web 端的自动化测试工具,直接运行在浏览器中,用来模拟用户操作。

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、文件上传、窗口截图等待,这里就不多介绍了,有兴趣的话,大家可以去看扩展阅读。

女票再让我帮她秒杀商品,再也不用傻傻等待,分分钟用 Selenium 写个秒杀应用有木有!:)

扩展阅读

谦虚、自律、胸有成竹、不露城府

本帖由系统于 4个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 26
Destiny

Dusk

4个月前

哈哈,我也尝试过秒杀的,自己写个Chrome扩展,捕捉页面元素,定时模拟点击 :stuck_out_tongue_closed_eyes:

4个月前

代码写好了,女朋友什么时候分配过来

4个月前
BradStevens

有点厉害

4个月前

@William2016 去淘宝,998 包邮到家:joy: 不用了之后还能把气放了

4个月前

666 ,赶紧试试

4个月前

get了

4个月前

OK,明天试一试。得睡觉了,晚安 :grin:

4个月前

mke

4个月前
select_and_action

用在淘宝京东上会被封号么?

4个月前

@select_and_action 一般不会的,因为根本检测不出来

4个月前
select_and_action

嗦嘎,有PHP的么?莫非得去学习下python/笑哭

4个月前

@select_and_action 这个就不得不说是 PHP 的弱项了,PHP 没有此类的包,尝试写一写 Python,是一门有趣的语言

4个月前
GhostCoder

弱弱的问下 SPA 的这种考 JS 渲染出来的 WEB 能用这个测试么

4个月前

@GhostCoder 没问题的

4个月前
GhostCoder

@無铭 :ok_hand:

4个月前
ayauper

都有什么使用场景呢??

3个月前
select_and_action

@li nice ,Thanks♪(・ω・)ノ

3个月前
凌寒傲雪

可以可以!我来测试测试一下,看看能不能弄个女朋友出来。

3个月前

@凌寒傲雪 哈哈,可以的

3个月前
skyLee

试了下,是每次打开新的浏览器,不带 cookie 呗?

3个月前

测试

3个月前
sushengbuhuo

好了知道你有女朋友了

1个月前

@sushengbuhuo :joy:你说的是充气的那种吗?不好意思,从来没买过

1个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!