Selenium Python教程第2章

news2024/12/23 0:08:49

2. Selenium 编程入门

在这里插入图片描述

2.1 简单用例

如果你已经安装好了selenium,你可以把下面的python代码拷贝到你的编辑器中

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

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

上面的脚本可以保存到一个文件(如:- python_org_search.py),那么可以这样使用

python python_org_search.py

你运行的 python 环境中应该已经安装了 selenium 模块。

示例详解
selenium.webdriver 模块提供了所有WebDriver的实现, 当前支持的WebDriver有: Firefox, Chrome, IE and Remote。 Keys类提供键盘按键的支持,比如:RETURN, F1, ALT等

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

接下来,创建一个Firefox WebDriver的实例

driver = webdriver.Firefox()

driver.get 方法将打开URL中填写的地址,WebDriver 将等待, 直到页面完全加载完毕(其实是等到”onload” 方法执行完毕),然后返回继续执行你的脚本。 值得注意的是,如果你的页面使用了大量的Ajax加载, WebDriver可能不知道什么时候页面已经完全加载:

driver.get("http://www.python.org")

下一行是用assert的方式确认标题是否包含“Python”一词。 (译注:assert 语句将会在之后的语句返回false后抛出异常,详细内容可以自行百度)

assert "Python" in driver.title

WebDriver 提供了大量的方法让你去查询页面中的元素,这些方法形如: find_element_by_*。 例如:包含 name 属性的input输入框可以通过 find_element_by_name 方法查找到, 详细的查找方法可以在第四节元素查找中查看:

elem = driver.find_element_by_name("q")

接下来,我们发送了一个关键字,这个方法的作用类似于你用键盘输入关键字。 特殊的按键可以使用Keys类来输入,该类继承自 selenium.webdriver.common.keys, 为了安全起见,我们先清除input输入框中的任何预填充的文本(例如:”Search”),从而避免我们的搜索结果受影响:

elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

提交页面后,你会得到所有的结果。为了确保某些特定的结果被找到,使用assert如下:

assert "No results found." not in driver.page_source

最后,关闭浏览器窗口,你还可以使用quit方法代替close方法, quit将关闭整个浏览器,而_close——只会关闭一个标签页, 如果你只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器:

driver.close()

2.2 一个稍复杂的示例,抓取股票价格信息

本例功能:从某网站首页,自动输入股票代码,打开1个新窗口,定位价格元素并打印数据。
请参考 本人博文

2.3. 用Selenium写测试用例

Selenium 通常被用来写一些测试用例. selenium 包本身不提供测试工具或者框架. 你可以使用Python自带的模块unittest写测试用例。 也可以使用pytest,nose等其它测试框架

在本章中,我们使用 unittest 来编写测试代码,下面是一个已经写好的用例。 这是一个在 python.org 站点上搜索的案例:

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

class PythonOrgSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source


    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

你可以在shell中运行下列代码:

python test_python_org_search.py
.
----------------------------------------------------------------------
Ran 1 test in 15.566s

OK

结果表明这个测试用例已经成功运行。

解释测试代码
一开始,我们引入了需要的模块, unittest 模块是基于JAVA JUnit的Python内置的模块。 该模块提供了一个框架去组织测试用例。 selenium.webdriver 模块提供了所有WebDriver的实现。 现在支持的WebDriver有:Firefox, Chrome, IE and Remote. Keys 类提供所有的键盘按键操作,比如像这样的:

RETURN, F1, ALT等。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

该测试类继承自 unittest.TestCase. 继承 TestCase 类是告诉 unittest 模块该类是一个测试用例:

class PythonOrgSearch(unittest.TestCase):

setUp 方法是初始化的一部分, 该方法会在该测试类中的每一个测试方法被执行前都执行一遍。 下面创建了一个Firefox WebDriver的一个实例。

def setUp(self):
    self.driver = webdriver.Firefox()

这是一个测试用例实际的测试方法. 测试方法始终以 test开头。 在该方法中的第一行创建了一个在 setUp 方法中创建的驱动程序对象的本地引用。

def test_search_in_python_org(self):
    driver = self.driver

driver.get 方法将会根据方法中给出的URL地址打开该网站。 WebDriver 会等待整个页面加载完成(其实是等待”onload”事件执行完毕)之后把控制权交给测试程序。 如果你的页面使用大量的AJAX技术来加载页面,WebDriver可能不知道什么时候页面已经加载完成:

driver.get("http://www.python.org")

下面一行使用assert断言的方法判断在页面标题中是否包含 “Python”

self.assertIn("Python", driver.title)

WebDriver 提供很多方法去查找页面值的元素,这些方法都以 find_element_by_* 开头。 例如:包含 name 属性的input元素可以使用

find_element_by_name`方法查找到。详细的细节可以参照 :ref:`locating-elements 章节:

elem = driver.find_element_by_name("q")

接下来我们发送keys,这个和使用键盘输入keys类似。 特殊的按键可以通过引入selenium.webdriver.common.keys的 Keys 类来输入

elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

提交页面之后,无论如何你都会得到搜索结果,为了确保某些结果类检索到,可以使用下列断言

assert "No results found." not in driver.page_source

tearDown 方法会在每一个测试方法执行之后被执行。 该方法可以用来做一些清扫工作,比如关闭浏览器。 当然你也可以调用 quit 方法代替close方法,

quit 将关闭整个浏览器,而close只会关闭一个标签页, 如果你只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器。

def tearDown(self):
    self.driver.close()

下面是入口函数:

if __name__ == "__main__":
    unittest.main()

2.4 使用远程 Selenium WebDriver

为了使用远程 WebDriver, 你应该拥有一个正在运行的 Selenium 服务器。 通过下列命令运行服务器:

java -jar selenium-server-standalone-2.x.x.jar

Selenium 服务运行后, 你会看到这样的提示信息:

15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub

上面一行告诉你,你可以通过这个URL连接到远程WebDriver, 下面是一些例子:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.CHROME)

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.OPERA)

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)

desired_capabilities是一个字典,如果你不想使用默认的字典,你可以明确指定的值

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities={'browserName': 'htmlunit',
                         'version': '2',
                        'javascriptEnabled': True})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AUTOSAR DoIP介绍

DoIP是什么 DoIP全称是Diagnostic Over IP,顾名思义就是基于IP的诊断,即下图所关联的ISO13400规范,也就是说如果大家想了解DoIP可以详细阅读ISO13400。 根据下图(来自于ISO14229-1),我们可以得到以下两点关系: UDS协议(规范是ISO14229)是统一诊断服务,作为应用层协议…

浏览器相关前端开发事项

文章目录 存储浏览器持久化存储(F12->应用->存储)浏览器缓存(F12->内存)浏览器存储管理单位(域名/IP为单位)区别localStorage VS 浏览器缓存localStorage VS cookies 存储 浏览器持久化存储&…

机器视觉陶瓷板表面划痕丝印检测方法

随着陶瓷制品在建筑、电子、医疗等领域的应用越来越广泛,对陶瓷制品的质量要求也越来越高。而陶瓷制品表面的划痕和丝印等缺陷会降低产品的美观度和质量,甚至会影响产品的安全性和使用寿命。传统的陶瓷板检测方式主要依赖人工目视检测,效率低…

FL Stuido21中文版水果编曲软件下载

FL stuido水果编曲软件做舞曲以及电子乐的利器,即便是在IPAD或者电脑端上操作,都非常的简便。界面逻辑非常友好,做rnb也是很可以的东西。可以作半成品的内容,声音采样方面还行,同样需要接口卡支持。钢琴卷帘操作还算便…

华为OD机试真题 Java 实现【字符串序列判定】【2022Q4 100分】,附详细解题思路

一、题目描述 输入两个字符串a和b&#xff0c;都只包含英文小写字母。a长度<100&#xff0c;b长度<500,000。 判定a是否是b的有效子串。 判定规则&#xff1a; a中的每个字符在b中都能找到&#xff08;可以不连续&#xff09;&#xff0c;且a在b中字符的前后顺序与a中…

FTL潜规则:调优,才是算法精华

前言 在存储领域中有一个FTL的概念&#xff0c;这是一种Flash的内存管理算法&#xff0c;属于各个厂商的核心机密&#xff0c;每个厂商的处理方式不同&#xff0c;有的处理简单&#xff0c;有的处理复杂。 FTL&#xff0c;即Flash Translations layer&#xff0c;也就是闪存转…

wayland浅析之EGL、Opengles、GBM

本文针对不同的compositor&#xff0c;浅析eglopenglesgbm搭配使用情况&#xff1b; 文章目录 1. 前言1.1 问题一&#xff1a;是不是调用eglSwapBuffers函数以后图像就直接显示到屏幕上了&#xff1f;1.2 问题二&#xff1a;EGL基本使用流程&#xff0c;EGL搭配GBM上屏显示基本…

JavaSE06_面向对象之封装

JavaSE-06 [面向对象OOP 封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是…

Servlet、JSP

一、web服务器 1.1 常用服务器产品 Tomcat&#xff08;Apache开源&#xff0c;主流的web服务器之一&#xff0c;多用于javaweb项目开发&#xff09; jetty&#xff08;效率高于Tomcat&#xff09; WebLogic&#xff08;Oracl 收费&#xff09; WebSpera&#xff08;IBM&#xf…

cesium学习之旅1:cesium 基本介绍以及 cesium 的 hello world 程序

一&#xff1a;什么是Cesium Cesium 是一个跨平台、跨浏览器的展示三维地球和地图的 javascript 库。Cesium 使用WebGL 来进行硬件加速图形&#xff0c;使用时不需要任何插件支持&#xff0c;但是浏览器必须支持WebGL。Cesium是基于Apache2.0 许可的开源程序。它可以免费的用于…

代码随想录二刷 day16 | 二叉树之104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

day16 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接 解题思路&#xff1a;本题中根节点的高度就是最大深度 二叉树节点的深度&#xff1a; 指从根节点到该节点的最长简单路径边的条数或者节点数&…

TensorFlow项目练手——天气预测

项目介绍 通过以往的天气数据和实际天气温度&#xff0c;做一次回归预测&#xff0c;模型的输入是当前的所有特征值&#xff0c;而模型的输出是当天的实际天气温度 字段分析 目前已有的数据有348条svc数据&#xff0c;他们的字段分别代表 year&#xff1a;年month&#xff…

美客多卖家攻略:养号技巧分享

在跨境电商平台上成功运营并建立起具有竞争力的店铺并不容易。美客多作为一个颇具影响力的平台&#xff0c;更需要卖家们仔细研究和精心运营。在这里&#xff0c;我将分享一些秘诀&#xff0c;这些秘诀是在我自养号过程中总结出来的&#xff0c;有助于增加销量并提升店铺的排名…

高级数据分析师岗位的职责描述

高级数据分析师岗位的职责描述1 职责&#xff1a; 1.搭建和完善数据中心的数据指标体系与监控预测体系&#xff0c;并推动系统化实现; 2.负责对市场、行业、竞争对手、产品、客户、业务运营等方面数据的收集、分析&#xff0c;完成整理出分析报告、提供数据支持、分析建议; 3.对…

AI 写的高考作文,你打几分?

又是一年高考时&#xff0c;高考真的是人生的一件大事&#xff0c;毕业这么多年&#xff0c;每次看到高考相关信息&#xff0c;还是会不由自主的点进来&#xff0c;其中语文的作文是每年大伙津津乐道的话题。 树先生今天就收到了某条小秘书的【邀请函】&#xff0c;邀请参与「…

Elasticsearch:实用指南

我们将更多地讨论使用 Elasticsearch 的最佳实践。这些做法是一般性建议&#xff0c;可以应用于任何用例。 让我们开始吧。 Bulk Requests 批量 API 使得在单个 API 调用中执行许多索引/删除操作成为可能。 这可以大大增加索引速度。 每个子请求都是独立执行的&#xff0c;因此…

Elasticsearch8.6.0安装

Elasticsearch 8.5.0 安装 Elasticsearch 简介Elasticsearch 8.6.0 安装创建网络拉取镜像运行镜像设置密码修改kibana配置绑定ES代码绑定&#xff1a;手动绑定&#xff1a; 配置ik分词器扩展词词典停用词词典 Elasticsearch 简介 Elasticsearch&#xff08;ES&#xff09; 是一…

Redis搭建分片集群

一、什么是Redis分片集群 1、概念 Redis分片集群是用于将Redis的数据分布在多个Redis节点上的分布式系统。通过分片集群&#xff0c;可以将数据分成多个部分&#xff0c;并将每个部分存储在不同的节点上&#xff0c;以便实现Redis的高可用性和高性能。 2、Redis分片集群原理…

写字楼里的「连接」智慧,撬起万亿新赛道

【潮汐商业评论/原创】 对于新入职的Cherry来说&#xff0c;在新公司上班的体验也是全新的。 每天上班&#xff0c;尚不熟悉的她可以在互动屏的指导下精准找到目的地。办公室的温度、湿度和空气质量&#xff0c;会随着天气条件和人员的密集程度相应调整。休息时Cherry抬头就能…

nc/netcat使用

目录 一、前言1.netcat是什么2.netcat有什么用 二、netcat的使用1.程序文件2.作为HTTP客户端3.作为HTTP服务端4.文件传输 三、问题与思考四、小结 一、前言 1.netcat是什么 netcat是一个基于命令行的网络调试和开发工具。对于windows和linux操作系统中都有适配的程序包,程序文…