首页 > 程序开发 > 综合编程 > 其他综合 >

Python - 如何用Selenium包做Web页面自动化测试

2016-10-04

Selenium是ThoughtWorks公司为Web自动化测试开发的工具,除支持多种操作系统如Linux、Mac OS X、Windows外,还支持Chrome、Firefox、Safari、Opera、IE等多种浏览器,适合做Web应用的兼容性测试及自动化测试。在Web开发的持续集成中

简介

Selenium是ThoughtWorks公司为Web自动化测试开发的工具,除支持多种操作系统Linux、Mac OS X、Windows外,还支持Chrome、Firefox、Safari、Opera、IE等多种浏览器,适合做Web应用的兼容性测试及自动化测试。在Web开发的持续集成中,如果每次迭代都采用手工方式对已有的功能进行回归测试,需要的人力、时间成本将是非常巨大的,采用Selenium进行自动化地回归测试,可以让团队的精力集中在新功能的测试上,提升工作效率。

本文主要介绍在Python中使用Selenium包进行自动化测试的方法,您需要具备一些HTML的知识及搭建Web服务器的方法,这样才能在学习的过程中亲手做实验,另外完整的示例代码放在我的github项目上,欢迎大家访问。首先使用pip install selenium命令安装Python的Selenium包。针对不同的浏览器及其版本使用Selenium的方法会有所不同,如下是我的版本信息:

操作系统:Mac OS Sierra Python: 2.7.10 Selenium: 2.53.6 Firefox: 47.0.1 Safari: 10.0 Opera: 39.0 Chrome: 53

使用方法

访问页面

Selenium运行自动化测试的方法是打开浏览器,按照脚本规定的步骤模拟人的操作,如点击按钮、在文本框输入文本等,然后检查期望结果。第一步就是要知道访问什么页面,比如测试使用Firefox访问百度:

# -*- coding: utf-8 -*-

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

# 目前支持的driver有Firefox, Chrome, IE和Remote等
driver = webdriver.Firefox(executable_path="./geckodriver")
# 直到页面被加载完(onload事件被触发)才将控制权返回脚本
driver.get('https://www.baidu.com')
assert u'百度一下,你就知道' in driver.title
print u"当前URL:", driver.current_url

对于使用了大量AJAX的页面,webdriver并不知道页面何时真正加载完成,这时需要使用waits告诉Selenium等待时间。

Webdriver是Selenium能够实现跨浏览器自动化测试的关键,通常简称wd。不同浏览器有不同的wd,但对外提供了统一的接口调用各个浏览器自身的自动化测试接口。上面Firefox的webdriver请在此下载

定位元素

打开页面后,第二件事情就是定位到我们要操作的页面元素,定位单个页面元素有如下方法(下面的方法,如果没有定位到相应的元素,抛出NoSuchElementException异常):

find_element_by_id:通过id属性定位元素(返回第一个匹配的)。 find_element_by_name:通过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:通过class属性定位元素(返回第一个匹配的)。 find_element_by_css_selector:使用CSS选择器语法定位元素(返回第一个匹配的)。

上面的方法,对应的批量定位方法如下(返回对应网页元素的列表):

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

此外,webdriver还有find_element及find_elements方法定位元素:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

By对象含有如下属性:

ID :元素id属性。 XPATH:xpath。 LINK_TEXT :超链接文本。 PARTIAL_LINK_TEXT :部分超链接文本。 NAME :元素name属性。 TAG_NAME :元素标签名字。 CLASS_NAME :元素class属性。 CSS_SELECTOR :使用CSS元素选择器语法。

操作文本框元素

比如在百度的输入框查询信息:

elem = driver.find_element_by_name('wd')

# 清空预填充内容
elem.clear()
# Keys对象表示键盘按键,如F1、ALT、ARROW_DOWN等
elem.send_keys(u'48.HTTP基本认证与摘要认证', Keys.RETURN)

assert u'Mars Loo的博客' in driver.page_source

# quit方法关闭整个浏览器
driver.quit()

上传文件也可以采用send_keys方法,此时参数提供为文件的路径即可。

操作表单元素

定位到一个表单元素后,可以调用其submit方法提交表单:

form = ff.find_element_by_name('survey')
form.submit()

如果调用submit方法的元素不是表单,抛出异常NoSuchElementException。提交表单也可以定位到提交按钮元素后,调用其click方法:

submit = ff.find_element_by_id('submit')
submit.click()

操作select元素

# 采用xpath获取第一个select元素(即使有多个也返回第一个)
element = ff.find_element_by_xpath("//select[@name='car']")
# 获取所有选项,打印选项值并点击
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print "Value is: %s" % option.get_attribute("value")
    option.click()
相关文章
最新文章
热点推荐