专栏首页用户7466307的专栏使用Python和Chrome安装Selenium WebDriver

使用Python和Chrome安装Selenium WebDriver

什么是WebDriver?

WebDriver是用于与实时Web浏览器进行交互的可编程界面。它使测试自动化能够打开浏览器,发送点击,键入键,刮擦文本并最终干净地退出浏览器。WebDriver界面是W3C建议书。WebDriver标准的最受欢迎的实现是Selenium WebDriver,它是免费和开放源代码。

WebDriver具有多个组件:

  1. 语言绑定。诸如Selenium WebDriver之类的软件包为浏览器交互 提供了编程语言绑定。Selenium支持主要语言,例如C#,Java,JavaScript,Ruby和Python。
  2. 自动化代码。程序员使用语言绑定来自动化浏览器交互。常见的 交互包括查找元素,单击元素以及抓取文本。通常,这是使用测 试自动化框架编写的。
  3. JSON Wire协议。语言绑定使用JSON对每个交互进行编码,并将 它们作为REST API请求发送到浏览器的驱动程序。JSON Wire协议 独立于平台和语言。
  4. 浏览器驱动程序。该驱动程序是测试计算机上的独立可执行文件。它充当交互的调用方和浏览器本身之间的代理。它接收JSON交互请 求,并使用HTTP将其发送到浏览器。
  5. 浏览器。浏览器呈现被测网页。它基本上由驾驶员控制。所有主要 的浏览器都支持WebDriver。每个浏览器还需要将自己的驱动程序 类型与浏览器安装在同一台计算机上,并且可以从系统路径进行 访问。例如,谷歌浏览器需要ChromeDriver。

安装Selenium WebDriver

对于我们的测试项目,我们将Selenium WebDriver的Python绑定与Google Chrome和ChromeDriver结合使用。我们可以使用任何浏览器,但请使用Chrome,因为(a)它具有很高的市场份额,并且(b)其开发人员工具稍后会派上用场。

验证ChromeDriver是否可以从命令行运行:

$ chromedriver
Starting ChromeDriver 73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

然后,将Python的selenium软件包安装到我们的环境中:

$ pipenv install selenium --dev

现在,机器应该可以进行网络测试了!

新测试

在名为的目录下创建一个新的Python模块。这个新模块将保存我们的Web UI测试。然后,添加以下导入语句:tests/test_web.py

import pytest

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys

为什么我们需要这些进口?

  • pytest 将用于固定装置
  • Chrome 提供ChromeDriver绑定
  • Keys 包含用于浏览器交互的特殊按键

WebDriver设置和清理

作为最佳实践,每个测试用例都应使用其自己的WebDriver实例。尽管设置和清除会给每个测试增加几秒钟的时间,但是每个测试使用一个WebDriver实例可使测试保持简单,安全和独立。如果一个测试遇到问题,那么其他测试将不会受到影响。另外,为每个测试使用单独的WebDriver实例可以使测试并行运行。

最好使用pytest固定装置处理WebDriver设置。fixtures是pytest出色的设置和清除功能,它们也可以进行依赖项注入。任何需要WebDriver实例的测试都可以简单地调用fixture来获取它。

代码

将以下代码添加到:tests/test_web.py:

@pytest.fixture
def browser():
  driver = Chrome()
  driver.implicitly_wait(10)
  yield driver
  driver.quit()

browser是一个pytest固定功能,如装饰器所示。让我们逐步完成每一行,以了解此新装置的功能。@pytest.fixture

driver = Chrome()

Chrome()使用默认选项在本地计算机上初始化ChromeDriver实例。它返回的驱动程序对象已绑定到ChromeDriver实例。所有WebDriver调用都将通过它进行.

driver.implicitly_wait(10)

Web UI测试自动化中最痛苦的部分是在触发交互之后等待页面加载/更改。该页面需要时间来呈现新元素。如果自动化尝试在存在新元素之前对其进行访问,则WebDriver将引发一个NoSuchElementException。等待不当是Web UI测试“不稳定”的主要来源之一。

implicitly_wait上面的 方法告诉驱动程序,每当尝试找到元素时,它们要等待10秒钟才能存在。等待机制很聪明:当元素出现时,它不会停止等待10秒钟,而是会立即停止等待。隐式等待被声明一次,然后自动用于 所有元素。另一方面,显式等待可以以每次显式等待调用为代价为每个交互提供自定义等待。作为最佳实践,用等待一个风格 完全用于测试自动化。混合显式和隐式等待会产生令人讨厌的意外副作用。对于我们的测试项目,隐式等待10秒应该是合理的(如果您的Internet连接速度很慢,请增加此超时时间以进行补偿)。

yield driver

pytest固定装置应返回一个表示已设置内容的值。我们的装置返回对初始化的WebDriver的引用。但是,return它使用而不是使用语句,这yield意味着fixture 是generator。fixture 的第一个迭代-在我们的例子中是WebDriver初始化-是在测试开始之前要调用的“设置”阶段。第二个迭代(将quit称为调用)是测试完成要调用的“清理”阶段 。编写夹具作为生成器将相关的设置和清理操作放在一起作为一个关注点。

driver.quit()

无论发生什么情况,始终在测试结束时退出WebDriver实例。测试自动化结束时,测试机上的驱动程序进程不会总是死掉。未能明确退出驱动程序实例可能会使它作为僵尸进程运行,这可能会消耗甚至锁定系统资源。

本文分享自微信公众号 - 软件测试test(gh_d29759b02f67),作者:Coldrain

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Selenium WebDriver简介

    是Selenium工具箱中功能最强大且最受欢迎的工具之一。WebDriver是Selenium RC的扩展版本,具有许多优点,并解决了其许多限制。与Seleni...

    用户7466307
  • 如何在Selenium WebDriver中查找元素?(一)

    有多种方法可以唯一地标识网页中的一个Web元素,例如ID,名称,类名,链接文本,部分链接文本,标记名和XPATH。

    用户7466307
  • 什么是数据驱动测试?学习创建框架

    数据驱动测试是一种软件测试方法,其中测试数据以表或电子表格格式存储。数据驱动的测试允许测试人员输入单个测试脚本,该脚本可以对表中的所有测试数据执行测试,并期望测...

    用户7466307
  • 【SLAM】|CVPR2019|LidarStereoNet:第一个无监督的Lidar-stereo融合网络,性能SOTA

    在本文中提出了LidarStereoNet,这是第一个无监督的Lidar-stereo融合网络,它可以在不需要地面真实深度图的情况下以端到端方式进行训练。通过引...

    CNNer
  • Github上10个值得学习的Springboot开源项目

    Spring Boot 几乎继承了所有 Spring 框架的优点,同时还可以让项目的配置更简化、编码更简化、部署更方便。近两年受到很多开发者的追捧,也是火热的不...

    三哥
  • Github 上热门的 Spring Boot 项目实战推荐

    Guide哥
  • WCF实现长连接

    由于WCF的机制,连接池会在连接建立一定时间后超时,即使设置了超时时间非常长,也可能被服务端系统主动回收。之前做项目时碰到了这个问题,所以项目上考虑采...

    少羽大怪兽
  • Tron(波场)实践篇

    官方文档:https://github.com/tronprotocol/Documentation/tree/master/%E4%B8%AD%E6%96%8...

    陨石坠灭
  • 开源想赚钱?快使用开源软件打赏平台IssueHunt

    对于普通开发者而言,在使用开源软件的过程中,有新特性的需求和遇到bug是非常常见的事情。但新特性并不一定在软件维护者的计划之中,而bug也不一定能够及时解决。

    灵魂画师牧码
  • App架构设计经验谈:数据层的设计

    一个App,从根本上来说,就是对数据的处理,包括数据从哪里来、数据如何组织、数据怎么展示,从职责上划分就是:数据管理、数据加工、数据展示。相对应的也就有了三层架...

    Keegan小钢

扫码关注云+社区

领取腾讯云代金券