使用Selenium通过浏览器对网站进行自动化测试和相关问题
使用Selenium通过浏览器对网站进行自动化测试
自动化测试概念:
一般是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。
广义上来讲,自动化包括一切通过工具或者运行程序的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试工具(loadrunner、jmeter),或自己所写的一段程序,用于生成测试数据。狭义上来讲,通工具记录或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来执行测试用例,从而代替人工对系统的功能进行验证。
我们需要规范的来做单元测试同样需要相应的单元测试框架,如java的Junit、testNG,C#的NUnit ,python 的unittest、pytest 等,几乎所有的主流语言,都会有其对应的单元测试框架。
自动化测试原理:
自动化测试分为动态测试和静态测试。
动态测试:通过特定的程序来模拟软件的操作过程或操作行为,然后对软件所作出的反应或者输出的结果进行检查和验证。
静态测试:按照代码规范和软件开发的最佳实践建立各种代码规则,然后依据这些规则对代码进行自动扫描,发现和规则不匹配的各种问题。
自动化测试工具的原理其实都一样,都是通过调用IE COM接口和HTML DOM 对IE、chrome、Firefox等浏览器以及WEB测试对象的操作,Android客户端的则是通过获取元素的ID以及测试对象来进行测试。
适合于使用自动化测试的项目要求:
首先考虑产品是否适合做自动化测试。这方法比较普遍的共识是从三个方面进行权衡:
1、软件需求变动不频繁
出于测试维护成本的考虑,如果软件的需求变动过于频繁,测试人员就要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。
项目中针对于某些相对稳定的模块,可以编写自动化测试脚本进行自动化测试,而某些变动较频繁的模块建议采用手工测试。
2、项目周期较长
由于自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成。这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。
3、自动化测试脚本可重复使用
自动化测试脚本的重复使用要从三个方面来考量,一方面所测试的项目之间是否很大的差异性(如C/S系统和B/S系统的差异);所选择的测试工具是否适应这种差异;最后,测试人员是否有能力开发出适应这种差异的自动化测试框架。自动化测试脚本重复使用可大大的减少测试成本。
自动化测试使用的工具:
首先要先确认你所测试的产品是桌面程序(C/S)还是web应用(B/S)。
桌面程序的工具有:QTP、 AutoRunner、Appium
web应用的工具有:QTP、AutoRunner、Robot Framework、watir、selenium
selenium 是支持java、python、ruby、php、C#、JavaScript 。
从语言易学性来讲,首选ruby ,python
从语言应用广度来讲,首选java、C#、php、
从语言相关测试技术成度来讲:ruby ,python ,java
或者你可以考虑整个技术团队主流用什么语言,然后选择相应的语言。
1、需要的工具
(1)eclipse、maven
(2)新建一个maven项目
(3)下载好FireFox、Chrome、IE,最好是默认安装
(4)下载好chromedriver.exe和IEDriverServer.exe
建立好的maven工程如下:
2、配置pom.xml文件
加入以下代码,自动下载相关jar包:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.49.1</version>
</dependency>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>Test</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>test</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.49.1</version>
</dependency>
</dependencies>
</project>
3、下载相关jar包
(1)右键工程--》选择【Maven】--》【Download Sources】;
(2)等待下载完相关jar包后,选择【Maven】--》【Update Project...】
4、新建测试类进行不同浏览器的自动化测试
(1)新建一个ExampleForChrome.java类测试chrome浏览器:
package Test.test; import java.io.IOException; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class ExampleForChrome {
public static void main(String[] args) throws IOException {
// 配置chromeDriver
System.setProperty("webdriver.chrome.driver", "C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe");
// System.setProperty("webdriver.chrome.driver", "D:/chromedriver.exe");
// 创建一个chrome的浏览器实例 ChromeOptions options = new ChromeOptions();
//通过配置参数禁止data;的出现
options.addArguments("--user-data-dir=C:/Users/Dell/AppData/Local/Google/Chrome/User Data/Default");
//通过配置参数删除“您使用的是不受支持的命令行标记:--ignore-certificate-errors。稳定性和安全性会有所下降。”提示
options.addArguments("--start-maximized","allow-running-insecure-content", "--test-type");
WebDriver driver;
driver = new ChromeDriver(options);
// 让浏览器访问www.baidu.com
driver.get("http://www.baidu.com");
// 获取网页的Title
System.out.println("Baidu's Title is:" + driver.getTitle());
// 通过id找到搜索输入框的DOM
WebElement element = driver.findElement(By.id("kw"));
// 在搜索框内输入关键字
element.sendKeys("上海");
// 提交搜索输入框所在的表单
element.submit();
// 等待10秒让搜索页面加载,判断新页面的Title为“上海”则说明新页面加载完毕
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().startsWith("上海");
}
});
// 显示新页面的Title
System.out.println("new page's title is:" + driver.getTitle());
// 测试完毕,关闭浏览器
driver.quit();
}
}
(2)新建一个ExampleForFireFox.java类测试Firefox浏览器:
package Test.test; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class ExampleForFireFox {
public static void main(String[] args) {
// 如果你的FireFox没有安装在默认的目录,那么必须在程序中设置,告知去哪里寻找FireFox
// System.setProperty("webdriver.firefox.bin", "D:\\Mozilla Firefox\\firefox.exe");
// System.setProperty("webdriver.firefox.bin", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
// 创建一个FireFox的浏览器实例(因为selenium是对Firefox默认支持的,所以不需要浏览器驱动就可直接创建运行)
WebDriver driver = new FirefoxDriver();
// 让浏览器访问www.baidu.com
driver.get("http://www.baidu.com");
// 获取网页的Title
System.out.println("Baidu's Title is:" + driver.getTitle());
// 通过id找到搜索输入框的DOM
WebElement element = driver.findElement(By.id("kw"));
// 在搜索框内输入关键字
element.sendKeys("上海");
// 提交搜索输入框所在的表单
element.submit();
// 等待10秒让搜索页面加载,判断新页面的Title为“上海”则说明新页面加载完毕
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().startsWith("上海");
}
});
// 显示新页面的Title
System.out.println("new page's title is:" + driver.getTitle());
// 测试完毕,关闭浏览器
driver.quit();
}
}
(2)新建一个ExampleForIE.java类测试IE浏览器:
package Test.test; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class ExampleForIE {
public static void main(String[] args) {
// 配置ieDriver
System.setProperty("webdriver.ie.driver", "D:\\IEDriverServer_x64_2.53.1.exe");
DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
// 创建一个IE的浏览器实例
WebDriver driver = new InternetExplorerDriver(ieCapabilities);
// 让浏览器访问www.baidu.com
driver.get("http://www.baidu.com");
// 获取网页的Title
System.out.println("Baidu's Title is:" + driver.getTitle());
// 通过id找到搜索输入框的DOM
WebElement element = driver.findElement(By.id("kw"));
// 在搜索框内输入关键字
element.sendKeys("上海");
// 提交搜索输入框所在的表单
element.submit();
// 等待10秒让搜索页面加载,判断新页面的Title为“上海”则说明新页面加载完毕
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().startsWith("上海");
}
});
// 显示新页面的Title
System.out.println("new page's title is:" + driver.getTitle());
// 测试完毕,关闭浏览器
driver.quit();
}
}
5、运行结果
【右键】--》选择【Run As】--》【Java Application】运行:
注意事项和相关说明:
关于Firefox浏览器:
1、Selenium天然支持FireFox,所以在使用FireFox的时候不需要去下载驱动,只需要指定FireFox的安装目录即可。甚至,如果你的FireFox是默认安装的,那么就不需要如下语句:System.setProperty("webdriver.firefox.bin","C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
如上代码所示,我的FireFox是安装在C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe下面的。
但是,如果使用Chrome或者IE就需要下载相应的驱动程序:chromedriver.exe
和IEDriverServer.exe
然后在代码中指定这两个驱动的存放位置就可以了。此处我的Chrome和IE浏览器都是默认安装的。
2、selenium与Firefox版本不兼容的问题,可以更新selenium最新版本或者降低Firefox版本。
【Selenium】 -> 【FireFox】
2.25.0 -> 18
2.30.0 -> 19
2.31.0 -> 20
2.42.2 -> 29
2.44.0 -> 33 (不支持31,2014/12/1)
若selenium的版本和firefox不兼容,需要升级selenium的jar包,或者是升级firefox。
切记,关掉forefox的升级功能,否则连本地Windows上的脚本都跑不起来,且必须降级forefox。
可以参考博文:http://www.cnblogs.com/tester808/p/6674588.html
http://blog.csdn.net/solami/article/details/6728544
http://blog.csdn.net/wanglha/article/details/50159397
网上找到的一些解决方法:
Firefox 45版本以上使用selenium-3.0.1无法直接启动需要如下步骤:
(1) 下载geckodriver.exe
https://github.com/mozilla/geckodriver/releases
解压后放置到
1.查看C:\Python27\Lib\site-packages\selenium\webdriver\firefox中的webdriver.py,在def_init_函数中,executable_path="geckodriver",之前搭建的环境上是executable_path="wires";
2.geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe,下载地址:https://github.com/mozilla/geckodriver/releases
3.放在C:\Python27(查看环境变量path中是否添加C:\Python27该路径)、
(2)
from selenium import webdriver
fromselenium.webdriver.common.desired_capabilities import DesiredCapabilities
fromselenium.webdriver.firefox.firefox_binary import FirefoxBinary
binary = FirefoxBinary(r'C:\ProgramFiles (x86)\Mozilla Firefox\firefox.exe')
driver =webdriver.Firefox(firefox_binary=binary)
driver.get('http://www.google.com')
关于IE浏览器:
1、IE浏览器需要关闭安全保护模式,不然就会打开不了网页。
2、针对windows vista和windows 7上的IE7或者更高的版本,必须在IE选项设置的安全页中,4个区域的启用保护模式的勾选都去掉(或都勾上),即保持四个区域的保护模式是一致的。如下图所示:
3、针对IE10和更高的版本,必须在IE选项设置中的高级页中,取消增强保护模式。如下图所示:
4、浏览器的缩放比例必须设置为100%,这样元素定位才不会出现问题,如下图所示:
5、针对IE11,需要修改注册表。如果是32位的windows,key值为
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet
Explorer\Main\FeatureControl\FEATURE_BFCACHE
,如果是64位的windows,key值为
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet
Explorer\Main\FeatureControl\FEATURE_BFCACHE
如果key值不存在,就添加。之后在key内部创建一个iexplorer.exe,DWORD类型,值为0,我的windows是64位的,修改后的注册表如下图所示:
之后,重新运行Java文件就可以正常打开浏览器了。
关于chrome浏览器:
当运行测试文件的时候,能够打开浏览器,但会出现【data;】的提示:如下图所示:
为了关闭这个提示,可以在Java类中添加以下代码:
ChromeOptions options = new ChromeOptions();
//通过配置参数禁止data;的出现
options.addArguments("--user-data-dir=C:/Users/Dell/AppData/Local/Google/Chrome/User Data/Default");
//通过配置参数删除“您使用的是不受支持的命令行标记:--ignore-certificate-errors。稳定性和安全性会有所下降。”提示
options.addArguments("--start-maximized","allow-running-insecure-content", "--test-type");
WebDriver driver;
driver = new ChromeDriver(options);
以上是我win10 系统,Dell电脑的设置。如果是win7 的系统,可以参考以下设置:
ChromeOptions options = new ChromeOptions();
//通过配置参数禁止data;的出现
options.addArguments("--user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/Default");
//通过配置参数删除“您使用的是不受支持的命令行标记:--ignore-certificate-errors。稳定性和安全性会有所下降。”提示
options.addArguments("--start-maximized",
"allow-running-insecure-content", "--test-type");
driver = new ChromeDriver(options);
如果以上设置完成,重新运行时出现以下错误:
可以看出,是chrome浏览器与chromeDriver.exe版本不兼容的问题,可以下载chromeDriver.exe的最新版本。
网上找了遇到相同问题的解决办法 http://blog.csdn.net/u012246342/article/details/52860949
下载v2.24版本的chromedriver.exe替换原有的chromedriver.exe(下载地址:http://chromedriver.storage.googleapis.com/index.html?path=2.24/);
重新运行成功!
网上找到的相关资料
下面是关于加载Chrome配置的方法(网上copy的,保存留用):
一、加载所有Chrome配置
用Chrome地址栏输入chrome://version/,查看自己的“个人资料路径”,然后在浏览器启动时,调用这个配置文件,代码如下:
#coding=utf-8
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data') #设置成用户自己的数据目录
driver = webdriver.Chrome(chrome_options=option)
二、修改浏览器的User-Agent来伪装你的浏览器访问手机m站
#coding=utf-8
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('--user-agent=iphone')
driver = webdriver.Chrome(chrome_options=option)
driver.get('http://www.taobao.com/')
三、浏览器启动时安装crx扩展
#coding=utf-8
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_extension('d:\crx\AdBlock_v2.17.crx') #自己下载的crx路径
driver = webdriver.Chrome(chrome_options=option)
driver.get('http://www.taobao.com/')
使用Selenium通过浏览器对网站进行自动化测试和相关问题的更多相关文章
- 杂项-自动化测试工具:Selenium(浏览器自动化测试框架)
ylbtech-杂项-自动化测试工具:Selenium(浏览器自动化测试框架) Selenium 是一个用于Web 应用程序测试的工具.Selenium 测试直接运行在浏览器中,就像真正的用户在操作一 ...
- 自动化测试-selenium启动浏览器
在自动化测试过程中,通过selenium启动浏览器时,可能需要加载插件(如测试用的firebug.或产品中要求必须添加某插件等).读取用户数据(自己浏览器的配置文件/别人直接给的浏览器配置文件).设置 ...
- 使用Python + Selenium打造浏览器爬虫
Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操 ...
- selenium原理应用 - 利用requests模拟selenium驱动浏览器
前言 selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#… 前面也有一篇文章说明了,selenium+浏览器的环境搭建. selenium支持多语言,是因为s ...
- selenium之浏览器、元素、鼠标等操作总结
1 控制浏览器 Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退.前进按钮等. 1.1 控制浏览器窗口大小 在不同的浏览 ...
- Selenium 设置浏览器下载 Firefox 和Chrome
当我们在使用Selenium运行自动化测试时,偶尔需要用到下载功能,但浏览器的下载可能会弹出下载窗口,或者下载路径不是我们想要保存的位置,所以在通过Selenium启动浏览器时需要做相关的设置,将使这 ...
- python爬虫:使用Selenium模拟浏览器行为
前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...
- [Python爬虫]使用Selenium操作浏览器订购火车票
这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
随机推荐
- Squid 缓存代理服务器的完整配置
Squid 缓存代理服务器 Squid 的作用 1.通过缓存的方式为用户提供web访问加速 2.对用户的web访问进行过滤控制 缓存代理服务器又分为普通代理服务器,透明代理服务器,和反向代理服务器. ...
- 面向对象 - 封装/property - 总结
面向对象 - 封装: 封装:在类定义阶段,以__开头的属性名发生了变形 eg: __x --> _A__x / __foo --> _A__foo 1.特点: 1.在类外部无法直接访问 _ ...
- FatMouse and Cheese---hdu1078(记忆化搜索=搜索+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意就是有n*n的地图,每个地方都有食物,数量不同,老鼠在(0,0)的位置每次它最多跳 k 步, ...
- tornado web应用程序结构
tornado web 应用程序通常包含一个或者多个RequestHandler 子类,一个Application 对象来为每个控制器路由到达的请求和一个mian()函数 import tornado ...
- Java并发—原子类,java.util.concurrent.atomic包(转载)
原子类 Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量 ...
- Java并发—java.util.concurrent并发包概括(转载)
一.描述线程的类:Runable和Thread都属于java.lang包 二.内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/noti ...
- java 多线程 day04 线程通信
package com.czbk.thread; /** * Created by chengtao on 17/12/3. * 需求: 子线程先运行10次,然后主线程运行 100次,依次运行50次 ...
- 修改hostname不重启机器并生效
1.依次执行: vi /etc/sysconfig/network 这种修改方式不会马上生效,需要重启服务器后生效,所以继续执行下面命令 echo ***(例如:node13 ...
- Hadoop的eclipse1.1.2插件的安装和配置
我的集群使用的hadoop版本是hadoop-1.1.2.对应的eclipse版本也是:hadoop-eclipse-plugin-1.1.2_20131021200005 (1)在eclipse的d ...
- 吴超老师课程--Pig的介绍和安装
1.Pig是基于hadoop的一个数据处理的框架. MapReduce是使用java进行开发的,Pig有一套自己的数据处理语言,Pig的数据处理过程要转化为MR来运行. 2.Pig的数据处理语言是数 ...