Selenium Webdriver之Chrome浏览器操作小记

Selenium

Selenium 是一套跨平台的浏览器自动化测试框架(工具),支持在多种系统环境、多种浏览器环境下使用,还可以使用多种编程语言来编写测试。

Selenium 有多个项目构成,形成了一个多功能的测试系统:

  • Selenium Core:支持DHTML 的测试案例(效果类似数据驱动测试),它是Selenium IDE 和Selenium RC
    的引擎。
  • Selenium Grid - 允许您在不同的计算机上并行运行不同浏览器的测试。也就是说,针对运行不同浏览器和操作系统的不同计算机同时运行多个测试。从本质上讲,Selenium-Grid支持分布式测试执行。它允许在分布式测试执行环境中运行测试。
  • Selenium IDE - 用于开发Selenium测试用例的工具。它是一个易于使用的Chrome和Firefox扩展,通常是开发测试用例的最有效方式。它使用现有的Selenium命令为您在浏览器中记录用户操作,并使用该元素的上下文定义参数。这不仅节省了时间,而且是学习Selenium脚本语法的绝佳方式。
  • Selenium RC (Selenium Remote Control) - 是一个客户端/服务器系统,允许您使用几乎任何编程语言和测试框架在本地或其他计算机上控制Web浏览器。
  • Selenium WebDriver - 主要新功能是集成WebDriver API。除了解决Selenium-RC API中的一些限制之外,WebDriver还旨在提供更简单,更简洁的编程接口。Selenium-WebDriver的开发是为了更好地支持动态网页,页面元素可能会在不重新加载页面的情况下发生变化。WebDriver的目标是提供精心设计的面向对象的API,为现代高级Web应用程序测试问题提供改进的支持。
Selenium 组成

注意:如出现Selenium官网访问缓慢,可以在 C:\Windows\System32\drivers\etc\hosts 文件内添加如下内容后尝试

172.217.31.243 www.seleniumhq.org

Selenium 1.0

Selenium 1.0(又名,Selenium RC 或 Selenium Remote Control) 发布于2004年,基本构成如下:

Selenium 1构成

主要的两个组件为:

  • Selenium RC Server - 解释并运行从测试程序传递的 Selenese 命令(Selenese 是 Selenium命令集合),并充当HTTP代理,拦截和验证在浏览器和AUT之间传递的HTTP消息。
  • Client libraries - 提供每种编程语言和Selenium RC Server之间的接口。

简化的架构图如下:

Selenium 1 简化架构图

Selenium 2.0

Selenium 2 = WebDriver + Selenium 1

Selenium 2.0发布于2011年,是Selenium 1.0与Selenium WebDriver合并而成的一款性能更佳的产品。

WebDriver是一种用于自动化Web应用程序测试的工具,尤其是用于验证它们是否按预期工作。它旨在提供一个易于探索和理解的友好API,比Selenium-RC(1.0)API更易于使用,这将有助于使您的测试更易于阅读和维护。它不依赖于任何特定的测试框架,因此它可以在单元测试项目中使用。

关于 Webdriver更多内容,可以查看w3c文档 2013版 2018版

Selenium 2

Selenium 2.0 具有来自 WebDriver 的清晰面向对象 API,并能以最佳的方式与浏览器进行交互,更多Selenium WebDriver的API接口操作可以查看此处。该版本中主推WebDriver,可以将其看做 Selenium RC 的替代。因为要保持向下兼容,Selenium 2.0 中并没有彻底放弃 Selenium RC。

Selenium 3.0

Selenium 3

Selenium 3.0首次发布于 2016年5月,主要有如下更新:

  • 停止使用 Selenium core (放弃Selenium RC)
  • 需要更高的Java版本支持(Java 8+)
  • 不再默认支持Firefox驱动程序(Mozilla推出Gecko Driver)
  • 使用W3C新标准的WebDriver
  • 浏览器供应商自己的WebDriver实现

三个版本关系大致如下:

Selenium 三个版本更替

Selenium与浏览器driver

为了实现Selenium对浏览器的操作,针对几款主流的浏览器,提供了对应的 driver

浏览器driver 地址
Chrome - ChromeDriver github 下载地址1 下载地址2
Firefox - GeckoDriver github 下载地址
Edge - Microsoft WebDriver github 下载地址
Safari - WebDriver source
其他浏览器Driver 此处下载

Selenium webdriver 模拟 Chrome 浏览器操作

对于 Selenium 的这里仅作简略介绍,大家可以参看官方文档或类似书籍来学习。下面通过一些小示例,简单记录在 Windows 10Python 2.7.15Selenium 3.14.1Chrome 71.0.3578.80环境下,Selenium webdriver API 驱动 Chrome 浏览器操作的过程。

Chrome浏览器及chromedriver版本对应

Selenium 可以操作对应版本的浏览器,就要下载对应的 Driver ,下面为 ChromeDriver 对应的 Chrome 版本

chromedriver版本 支持的Chrome版本
v2.44 v69-71
v2.43 v69-71
v2.42 v68-70
v2.41 v67-69
v2.40 v66-68
v2.39 v66-68
v2.38 v65-67
v2.37 v64-66
v2.36 v63-65
v2.35 v62-64
v2.34 v61-63
v2.33 v60-62
v2.32 v59-61
v2.31 v58-60
v2.30 v58-60
v2.29 v56-58
v2.28 v55-57
v2.27 v54-56
v2.26 v53-55
v2.25 v53-55

注意:Chrome 70+ 版本后出现对应小版本的chromedriver,如本文浏览器版本为 71.0.3578.80 ,则下载对应该版本的chromedriver。更多版本查看此处

Python安装Selenium

Selenium Python bindings 是Selenium WebDriver的Python绑定版本,用于Python的自动化浏览器交互操作。

支持 Python 2.7Python 3.4+ 版本。

Python安装Selenium可以通过如下命令

pip install selenium
或
easy_install selenium

如果使用 AnacondaMiniconda ,则使用如下命令安装

conda install seleium

chromedriver 下载及配置

下载对应当前 Chrome 浏览器版本的 chromedriver ,在任意目录解压后,将解压后的路径配置到环境变量中方便程序中直接引用。

注意:64位浏览器下载32位driver即可。

注意: 操作不同浏览器,需要下载对应浏览器版本的driver,并添加driver路径到环境变量中,否则运行代码时,会出现类似selenium.common.exceptions.WebDriverException: Message: 'xxxdriver' executable needs to be in PATH. 的异常提示

Selenium webdriver实例化及页面访问

以下演示 Selenium 操控 Chrome 浏览器,打开百度页面

from selenium import webdriver

chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome()   # 设置了chromedriver的环境变量,则此行代码等效于上面两行代码
driver.get("https://www.baidu.com")
driver.maximize_window()  # 好像没有效果。。。
driver.quit()

get 方法会在页面 onload 完成后显示页面,并继续执行后续代码,如页面内存在大量Ajax请求时,为了保证页面完整加载,可以考虑使用waits来等待页面加载完成

chromedriver 打开百度首页

Selenium webdriver API 获取页面元素

要定位一个元素,Selenium提供了下列的查找元素的方法:

  • find_element_by_id - 查找对应id的元素
  • find_element_by_name - 查找对应名称的元素
  • find_element_by_xpath - 查找对应xpath的元素
  • find_element_by_link_text - 查找对应超链接文本的元素
  • find_element_by_partial_link_text - 查找含有超链接文本的元素
  • find_element_by_tag_name - 查找对应标签名的元素
  • find_element_by_class_name - 查找对应类名的元素
  • find_element_by_css_selector - 查找对应css选择器的元素

如果要获取多个相同元素(返回list列表),

  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

除了上述的公共方法,还提供了两个私有方法

配合 By 类也可以用来实现上面方法的功能,By 类提供了一组支持的定位策略属性:

  • CLASS_NAME = 'class name'
  • CSS_SELECTOR = 'css selector'
  • ID = 'id'
  • LINK_TEXT = 'link text'
  • NAME = 'name'
  • PARTIAL_LINK_TEXT = 'partial link text'
  • TAG_NAME = 'tag name'
  • XPATH = 'xpath'

上述方法使用参看此处 (对应Selenium WebDriver API参看此处

以下演示 selenium 查找百度首页按钮元素,边获取元素值

from selenium import webdriver

chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome()   # 设置了chromedriver的环境变量,则此行代码等效于上面两行代码
driver.get("https://www.baidu.com")
# 查找元素
search_btn = driver.find_element_by_id('su')  #获取百度首页“百度一下”按钮元素
print search_btn
print search_btn.id
print search_btn.size
print search_btn.tag_name
print search_btn.text
# 获取元素属性值
print search_btn.get_property('type')
print search_btn.get_attribute('class')
print search_btn.get_property('value')
# 获取元素状态
print search_btn.is_displayed()
print search_btn.is_enabled()
print search_btn.is_selected()
# 获取元素css样式
print search_btn.value_of_css_property('font')
print search_btn.value_of_css_property('color')
print search_btn.value_of_css_property('background')
driver.quit()

Selenium webdriver API 页面表单操作

以下演示 Selenium 实现百度一下操作(用百度查找 “selenium” 相关内容)

from selenium import webdriver
from selenium.webdriver.common.by import By

chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome()   # 设置了chromedriver的环境变量,则此行代码等效于上面两行代码
driver.get("https://www.baidu.com")
# 获取百度首页输入框
search_input = driver.find_element(By.NAME, 'wd')
# 输入框内填写 “selenium”
search_input.send_keys("selenium")
# 获取百度首页“百度一下”按钮
search_btn = driver.find_element(By.ID, 'su')
# 点击按钮,实现表单提交
search_btn.click()

# driver.quit()

获取输入框元素后,使用 send_keys() 方法模拟输入需要查找的内容,之后获取按钮元素,并触发 click() 方法模拟点击事件,以此模拟完成百度搜索功能

chromedirver 实现百度搜索

参考阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容