A快速开始
1.安装selenium webdriver(eclipse+jdk+testng+selenium
webdriver2.20+firefox 10)
1、安装firefox,使用firefox10。确保firefox安装在默认环境下(不是的话会报错)。
2、安装jdk,确保安装了jdk,我使用是java。但selenium webdriver也支持其它语言,如ruby、python、C#等。
3、安装eclipse。
4、安装selenium webdriver(https://www.wendangku.net/doc/1c14761296.html,/download/下载selenium rc 2.21.0)。解压下载的selenium webdriver包,在eclipse中你建立的项目中导入所下载的包。(如下提示) 注:1.右键项目—选择build path选项—选择configure build path点击
2.选择右侧add external jars(如图)
3.找到所下载的selenium-server-standalone-2.21.0包,点击确定
4.点击ok,包就能导入项目
2.配置testng
1.介绍
TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试(隔
离测试一个类)到集成测试(测试由有多个类多个包甚至多个外部框架组成的整
个系统,例如运用服务器)。
a. TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到
集成测试
这个是TestNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试。设计目标的不同,对比junit的只适合用于单元测试,TestNG无疑走的更远。可以用于集成测试,这个特性是我选择TestNG的最重要的原因。
b. 测试的过程的三个典型步骤,注意和junit(4.0)相比,多了一个将测试
信息添加到testng.xml 文件或者build.xml
测试信息尤其是测试数据不再写死在测试代码中,好处就是修改测试数据
时不需要修改代码/编译了,从而有助于将测试人员引入单元测试/集成测试。
c. 基本概念,相比junit的TestCase/TestSuite,TestNG有
suite/test/test method 三个级别,即将test/test method 明确区分开了。
2.配置testng
1.Eclipse中点击Help->Install new software
2.点击Add 在Location输入https://www.wendangku.net/doc/1c14761296.html,/eclipse
3.选中Testng版本,点击Next,按照提示安装,安装完之后重启Eclipse
4.新建JavaProject,右键BuildPath,添加testng-
5.11-jdk15.jar和eclipse-testng.jar
5.新建一个sum类,用来计算两整数之和,代码如下:
package com.hpp;
public class sum {
private int no1;
private int no2;
private intmysum;
public int add(int no1,int no2){
mysum=no1+no2;
return mysum;
}
}
6.再新建testng class
点击finish,代码如下
package com.test;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals; import com.hpp.sum;
public class NewTest {
private sum newSum=new sum();
@Test
public void f() {
intmysum=newSum.add(1, 2); assertEquals(3,mysum,"Right");
}
}
testing,xml会自动配置好的,这里不用管项目的文件结构如下:
7.在testing.xml右键点击RunAs->Testng Suite,即可看到结果
至此环境的搭建全部完成,下面来做第一个test。
3.第一个test
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class FirstExampe {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("https://www.wendangku.net/doc/1c14761296.html,");
WebElement element = driver.findElement(https://www.wendangku.net/doc/1c14761296.html,("q")); element.sendKeys("hello Selenium!");
element.submit();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
正常运行后,这几行代码将会打开firefox浏览器,然后转跳到google首页。在搜索框中输入hello Selenium并提交搜索结果。
B对浏览器的简单操作
1.打开一个测试浏览器
对浏览器进行操作首先需要打开一个浏览器,接下来才能对浏览器进行操作。
Java代码
importjava.io.File;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
importorg.openqa.selenium.ie.InternetExplorerDriver;
public class OpenBrowsers {
public static void main(String[] args) {
//打开默认路径的firefox
WebDriver diver = new FirefoxDriver();
//打开指定路径的firefox,方法1
System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriverdr = new FirefoxDriver();
//打开指定路径的firefox,方法2
File pathToFirefoxBinary = new File("D:\\Program Files\\Mozilla Firefox\\firefox.exe");
FirefoxBinaryfirefoxbin = new FirefoxBinary(pathToFirefoxBinary);
WebDriver driver1 = new FirefoxDriver(firefoxbin,null);
//打开ie
WebDriverie_driver = new InternetExplorerDriver();
//打开chrome
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
System.setProperty("webdriver.chrome.bin",
"C:\\Documents and Settings\\gongjf\\Local Settings"
+"\\Application
Data\\Google\\Chrome\\Application\\chrome.exe");
}
}
2.打开1个具体的url
打开一个浏览器后,我们需要跳转到特定的url下,看下面代码:
Java代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class OpenUrl {
public static void main(String []args){
String url = "https://www.wendangku.net/doc/1c14761296.html,";
WebDriver driver = new FirefoxDriver();
//用get方法
driver.get(url);
//用navigate方法,然后再调用to方法
driver.navigate().to(url);
}
}
3.如何关闭浏览器
测试完成后,需要关闭浏览器
Java代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class CloseBrowser {
public static void main(String []args){
String url = "https://www.wendangku.net/doc/1c14761296.html,";
WebDriver driver = new FirefoxDriver();
driver.get(url);
//用quit方法
driver.quit();
//用close方法
driver.close();
}
}
4.如何返回当前页面的url和title
有时候我们需要返回当前页面的url或者title做一些验证性的操作等。代码如下:Java代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class GetUrlAndTitle {
public static void main(String []args){
String url = "https://www.wendangku.net/doc/1c14761296.html,";
WebDriver driver = new FirefoxDriver();
driver.get(url);
//得到title
String title = driver.getTitle();
//得到当前页面url
String currentUrl = driver.getCurrentUrl();
//输出title和currenturl
System.out.println(title+"\n"+currentUrl);
}
}
5.其他方法
getWindowHandle() 返回当前的浏览器的窗口句柄
getWindowHandles() 返回当前的浏览器的所有窗口句柄
getPageSource() 返回当前页面的源码
从上面代码可以看出操作浏览器的主要方法都来自org.openqa.selenium.WebDriver这个接口中。看了一下源代码这些方法都是在org.openqa.selenium.remote.RemoteWebDriver这个类中实现的,然后不同浏览的driver类继承RemoteWebDriver。
C定位页面元素
selenium-webdriver提供了强大的元素定位方法,支持以下三种方法。
单个对象的定位方法
多个对象的定位方法
层级定位
定位单个元素
在定位单个元素时,selenium-webdriver提示了如下一些方法对元素进行定位。
By.className(className))
By.cssSelector(selector)
By.id(id)
By.linkText(linkText)
https://www.wendangku.net/doc/1c14761296.html,(name)
By.partialLinkText(linkText)
By.tagName(name)
By.xpath(xpathExpression)
注意:selenium-webdriver通过findElement()\findElements()等find方法调用"By"对象来定位和查询元素。By类只是提供查询的方式进行分类。findElement返回一个元素对象否则抛出异常,findElements返回符合条件的元素List,如果不存在符合条件的就返回一个空的list。
1.使用className进行定位
当所定位的元素具有class属性的时候我们可以通过classname来定位该元素。
下面的例子定位了https://www.wendangku.net/doc/1c14761296.html,首页上class为"username"的li。
Java代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
public class ByClassName {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("https://www.wendangku.net/doc/1c14761296.html,");
WebElement element = driver.findElement(By.className("username"));
System.out.println(element.getTagName());
}
}
输出结果:
Java代码
Li
2.使用id属性定位
https://www.wendangku.net/doc/1c14761296.html,首页的帐号输入框的html代码如下:
Java代码
在下面的例子中用id定位这个输入框,并输出其title,借此也可以验证代码是否工作正常。
Java代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class ByUserId {
/**
* @paramargs
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WebDriverdr = new FirefoxDriver();
dr.get("https://www.wendangku.net/doc/1c14761296.html,");
WebElement element = dr.findElement(By.id("passport_51_user"));
System.out.println(element.getAttribute("title"));
}
}
输出结果:
Java代码
用户名/彩虹号/邮箱
3.使用name属性定位
https://www.wendangku.net/doc/1c14761296.html,首页的帐号输入框的html代码如下:
Java代码
使用name定位
Java代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class ByUserId {
/**
* @paramargs
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WebDriverdr = new FirefoxDriver();
dr.get("https://www.wendangku.net/doc/1c14761296.html,");
WebElement e = dr.findElement(https://www.wendangku.net/doc/1c14761296.html,("passport_51_user"));
System.out.println(element.getAttribute("title"));
}
}
输出结果:
Java代码
用户名/彩虹号/邮箱
4.使用css属性定位
https://www.wendangku.net/doc/1c14761296.html,首页的帐号输入框的html代码如下:
Java代码
使用css定位
Java代码
WebElement e1 = dr.findElement(By.cssSelector("#passport_51_user"));
5.使用XPATH定位
https://www.wendangku.net/doc/1c14761296.html,首页的帐号输入框的html代码如下:
Java代码
通过xpath查找:
Java代码
WebElement element =driver.findElement(By.xpath("//input[@id='passport_51_user']")); 6.使用其他方式定位
在定位link元素的时候,可以使用link和link_text属性;
另外还可以使用tag_name属性定位任意元素;
7..定位多个元素
上面提到findElements()方法可以返回一个符合条件的元素List组。看下面例子。
Java代码
importjava.io.File;
importjava.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
public class FindElementsStudy {
/**
* @author gongjf
*/
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("https://www.wendangku.net/doc/1c14761296.html,");
//定位到所有标签的元素,然后输出他们的id
List
for (WebElement e : element){
System.out.println(e.getAttribute("id"));
}
driver.quit();
}
}
输出结果:
Java代码
passport_cookie_login
gourl
passport_login_from
passport_51_user
passport_51_password
passport_qq_login_2
btn_reg
passport_51_ishidden
passport_auto_login
上面的代码返回页面上所有input对象
8.层级定位
层级定位的思想是先定位父元素,然后再从父元素中精确定位出其我们需要选取的子元素。层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
下面的代码演示了如何使用层级定位class为"login"的div,然后再取得它下面的所有label,并打印出他们的文本
Java代码
importjava.io.File;
importjava.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxBinary;
importorg.openqa.selenium.firefox.FirefoxDriver;
public class LayerLocator {
/**
* @author gongjf
*/
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("https://www.wendangku.net/doc/1c14761296.html,");
//定位class为"login"的div,然后再取得它下面的所有label,并打印出他们的值
WebElement element = driver.findElement(By.className("login"));
List
for(WebElement e : el)
System.out.println(e.getText());
}
}
输出结果:
Java代码
帐号:
密码:
隐身
下次自动登录
D 如何对页面元素进行操作
找到页面元素后,怎样对页面进行操作呢?我们可以根据不同的类型的元素来进行一一说明。
1.输入框(text field or textarea)
找到输入框元素:
WebElement element = driver.findElement(By.id("passwd-id"));
在输入框中输入内容:
element.sendKeys(“test”);
将输入框清空:
element.clear();
获取输入框的文本内容:
element.getText();
2.下拉选择框(Select)
找到下拉选择框的元素:
Select select = new Select(driver.findElement(By.id("select")));
选择对应的选择项:
select.selectByVisibleText(“mediaAgencyA”);
或
select.se lectByValue(“MA_ID_001”);
不选择对应的选择项:
select.deselectAll();
select.deselectByValue(“MA_ID_001”);
select.deselectByVisibleText(“mediaAgencyA”);
或者获取选择项的值:
select.getAllSelectedOptions();
select.getFirstSelectedOption();
对下拉框进行操作时首先要定位到这个下拉框,new 一个Selcet对象,然后对它进行操作
3. 单选项(Radio Button)
找到单选框元素:
WebElementbookMode =driver.findElement(By.id("BookMode"));
选择某个单选项:
bookMode.click();
清空某个单选项:
bookMode.clear();
判断某个单选项是否已经被选择:
bookMode.isSelected();
4.多选项(checkbox)
多选项的操作和单选的差不多:
WebElement checkbox =driver.findElement(By.id("myCheckbox.")); checkbox.click();
checkbox.clear();
checkbox.isSelected();
checkbox.isEnabled();
5.按钮(button)
找到按钮元素:
WebElementsaveButton = driver.findElement(By.id("save"));
点击按钮:
saveButton.click();
判断按钮是否enable:
saveButton.isEnabled ();
6.左右选择框
也就是左边是可供选择项,选择后移动到右边的框中,反之亦然。例如:Select lang = new Select(driver.findElement(By.id("languages")));
lang.selectByVisibleText(“English”);
WebElementaddLanguage =driver.findElement(By.id("addButton")); addLanguage.click();
7.弹出对话框(Popup dialogs)
Alert alert = driver.switchTo().alert();
alert.accept();
alert.dismiss();
alert.getText();
后面有具体的例子解释~
8.表单(Form)
Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:WebElement approve = driver.findElement(By.id("approve"));
approve.click();
或
approve.submit();//只适合于表单的提交
9.上传文件(Upload File)
上传文件的元素操作:
WebElementadFileUpload = driver.findElement(By.id("WAP-upload"));
String filePath = "C:\test\\uploadfile\\media_ads\\test.jpg";
adFileUpload.sendKeys(filePath);
10.拖拉(Drag andDrop)
WebElement element =driver.findElement(https://www.wendangku.net/doc/1c14761296.html,("source"));
WebElement target = driver.findElement(https://www.wendangku.net/doc/1c14761296.html,("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
11.导航(Navigationand History)
打开一个新的页面:
driver.navigate().to("https://www.wendangku.net/doc/1c14761296.html,");
通过历史导航返回原页面:
driver.navigate().forward();
driver.navigate().back();
Eiframe的处理
有时候我们在定位一个页面元素的时候发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题。这时你就要看一下这个页面元素是否在一个iframe中,这可能就是找不到的原因之一。如果你在一个default content中查找一个在iframe中的元素,那肯定是找不到的。反之你在一个iframe中查找另一个iframe元素或default content中的元素,那必然也定位不到。
selenium webdriver中提供了进入一个iframe的方法:
WebDriverorg.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
也提供了一个返回default content的方法:
WebDriverorg.openqa.selenium.WebDriver.TargetLocator.defaultContent()
这样使我们面对iframe时可以轻松应对。
以下面的html代码为例,我们看一下处现iframe。
Html代码
main.html
frame.html
Java代码
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebDriver;
importorg.openqa.selenium.firefox.FirefoxDriver;
WebDriver 之测试失败自动截图 webDriver 测试的时候最头疼的就是调试。但也远不及运行的时候出错,再回头调试来的痛苦。总所周知, web 自动化的代码都非常脆弱,一份代码一会运行失败,一会运行成功也是很正常的事情。总的来说造成案例运行失败的原因大抵有两点:环境问题:比如网络不稳定啊 代码变动:比如某个元素不在 遇到 bug :这就是真的发现 bug 了 无论哪一种,遇到了都需要花一番时间去debug。那如果这个时候有一张运行时候出错的截图,那就一目了然了。(即便不一目了然,也有很多帮助) 在运行出错的时候,捕获错误并截图有两种思路: 自定义一个WeDdriver 的监听器,在出异常的时候截图。 利用Juint 的TestRule,自定义一个Rule 在运行失败的时候截图。 自定义监听器 截图的原理 截图需要用到RemoteWebDriver。在 Selenium 官方我们可以找到: One nice feature of the remote webdriver is that exceptions often have an attached screen shot, encoded
as a Base64 PNG. In order to get this screenshot, you need to write code similar to: public String extractScreenShot(WebDriverException e) { Throwable cause = e.getCause(); if (cause instanceof ScreenshotException) { return ((ScreenshotException) cause).getBase64EncodedScreenshot(); } return null; } 意思就是说,每个异常都是ScreenshotException 的对象,转码一下就可以用了。这是截图的本质。 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import org.openqa.selenium.WebDriver;
. python webdriver 项目实战 文档Word . 第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。 脚本一 fro selenium impor webdriver impor time driver = webdriver.Firefox() driver.get睜睷?硸) driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡) driver.find_element_by_id瑜偢獡睳牯).send_keys???) driver.find_element_by_id扜湴潌楧).click() 执行具体用例操 ...... driver.quit ()脚本二 from selenium import webdriver import time driver = webdriver.Firefox() driver.get(睜睷?硸?) driver.find_element_by_id(瑜啢敳乲浡履).send_keys(甥敳湲浡履)
driver.find_element_by_id(瑜偢獡睳牯層).send_keys(???尶) driver.find_element_by_id(扜湴潌楧屮).click() #执行具体用例操作 文档Word . ...... driver.quit ()通过上面的两个脚本,我们很明显的发现它的问题: 一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。 这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。 这种模式下脚本的可重复使用率很低。 模块化与库 我们会清晰的发现在上面的脚本中,其实有不少内容是重复的;于是就有了下面的改进。login.py 登录模de login(): driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡) driver.find_element_by_id瑜偢獡睳牯).send_keys??㈱) driver.find_element_by_id扜湴潌楧).click() 测试用例:#coding=utf-fro selenium impor webdriver 文档Word . 注意,上面代码并非完整代码,不能运行。
Webdriver定位不到元素的解决办法 Webdriver定位不到元素的解决办法 不知道怎么回事,先前能跑动的case,现在元素始终找不到。但是我xpath是能定位得到的,debug了一下,结果发现在WebElementelement = locator.findElement();就卡 住了。弄了好久也没有成功。网上找例子:Selenium2(WebDriver)_如何判断WebElement元素对象是否存在 1.selenium中如果去寻找元素,而元素不存在的话,通常会抛出NoSuchElementException 导致测试失败,但有时候,我们需要去确保页面元素不存在,才是我们正确的验收条件下面的方法可以用来判定页面元素是否存在 1 public boolean doesWebElementExist(WebDriver driver, By selector)2{3 4 try 5 { 6 driver.findElement(selector);7 returntrue;8 }9 catch(NoSuchElementException e)10 {11 return false; 12 }13 } 2.一般有这样的应用场合,例如我们要验证在一个网站是否登录成功,那么可以通过判
断登录之后是否显示相应元素:WebElementlinkUsername =driver.findElement(By.xpath("//a[contains(text(),"+username+" )]"));return linkUsername.isDisplayed();这一方法的前提是:该元素之前已经存在,仅仅需要判断是否被显示。现在存在另一种场合,页面元素并不存在,即通过driver.findElement只能在超时之后得到NoSuchElementException的异常。因此只好通过如下方法解决:1 boolean ElementExist (ByLocator )2{3 try4 {5 driver.findElement( Locator );6 returntrue;7}8 catch(org.openqa.selenium.NoSuchElementException ex)9{10 returnfalse;11 }12 }
selenium webdriver+python的基本操作 quit() 退出并关闭某程序,browser.quit() .close() 关闭窗口,Browser.close() time.sleep() 函数 设置某个位置停留一段时间,在哪里想停留就在哪里插入此函数,括号里为秒数,注意:使用此函数,要import time。
设置登录成功后停留了10秒,然后关闭页面 在适当的位置加入time.sleep()有助于减少网络原因造成的脚本执行失败.title 返回当前页面的标题 browser.title .forward() 前进,browser.foeward() .back() 后退,browser.back() .refresh() 刷新,browser.refresh()
.current_url 返回当前页面url,browser.current_url .window_handles 返回当前浏览器的所有窗口,browser.window_handles .current_window_handle 返回当前浏览器的窗口句柄,browser.current_window_handle .swatch_to_window(“window_name”) 选择窗口,browser.switch_to_window(“要切换到的窗口名”) 对话框操作 .switch_to_alert() 选择窗口对象 accept() 点击“确认” .dismiss() 点击“取消” text 获取文本值
Send_keys(‘keys’) 输入值 定位元素 Id定位 browser.find_element_by_id(‘id’) name定位 browser.find_element_by_name(‘name’) css定位 CSS(Cascading Style Sheets)是一种语言,它被用来描述HTML和XML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。 CSS的比较灵活可以选择控件的任意属性 browser.find_element_by_css_selector(‘#foo’) css定位可以取name属性,如: 新闻 driver.find_element_by_css_selector("a[name=\"tj_news\"]").click() 可以取title属性,如: 网页 driver.find_element_by_css_selector("a[title=\"web\"]").click() 也可以是取..: driver.find_element_by_css_selector("a.RecycleBin").click()
A快速开始 1.安装selenium webdriver(eclipse+jdk+testng+selenium webdriver2.20+firefox 10) 1、安装firefox,使用firefox10。确保firefox安装在默认环境下(不是的话会报错)。 2、安装jdk,确保安装了jdk,我使用是java。但selenium webdriver也支持其它语言,如ruby、python、C#等。 3、安装eclipse。 4、安装selenium webdriver(https://www.wendangku.net/doc/1c14761296.html,/download/下载selenium rc 2.21.0)。解压下载的selenium webdriver包,在eclipse中你建立的项目中导入所下载的包。(如下提示) 注:1.右键项目—选择build path选项—选择configure build path点击 2.选择右侧add external jars(如图)
3.找到所下载的selenium-server-standalone-2.21.0包,点击确定
4.点击ok,包就能导入项目
2.配置testng 1.介绍 TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试(隔 离测试一个类)到集成测试(测试由有多个类多个包甚至多个外部框架组成的整 个系统,例如运用服务器)。 a. TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到 集成测试 这个是TestNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试。设计目标的不同,对比junit的只适合用于单元测试,TestNG无疑走的更远。可以用于集成测试,这个特性是我选择TestNG的最重要的原因。 b. 测试的过程的三个典型步骤,注意和junit(4.0)相比,多了一个将测试 信息添加到testng.xml 文件或者build.xml 测试信息尤其是测试数据不再写死在测试代码中,好处就是修改测试数据 时不需要修改代码/编译了,从而有助于将测试人员引入单元测试/集成测试。 c. 基本概念,相比junit的TestCase/TestSuite,TestNG有 suite/test/test method 三个级别,即将test/test method 明确区分开了。 2.配置testng 1.Eclipse中点击Help->Install new software 2.点击Add 在Location输入https://www.wendangku.net/doc/1c14761296.html,/eclipse
本文将总结Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展。举例说明扩展Alt+PrtSc 组合键来截取当前活动窗口并将剪切板图像保存到文件。 在使用Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是Actions 类,在使用该类的过程中会配合使用到Keys 枚举以及Mouse、Keyboard、CompositeAction 等类。 其次,在实际测试过程中,可能会遇到某些按键没办法使用Actions、Keys 等类来实现的情况。比如通过使用Alt+PrtSc 组合键来实现截取屏幕当前活动窗口的图像,在Keys 枚举中,因为没有枚举出PrtSc 键,所以没办法通过Action 的KeyDown(Keys) 来模拟按下这个动作。 再次是在自动化测试中,可能会遇到一些附件、文件上传的场景,或者是多文件上传,这些在Selenium2.0 之后,可以直接使用WebElement 类的sendKeys() 方法来实现。 下面就分别介绍这些情况的具体使用。 鼠标点击操作 鼠标点击事件有以下几种类型: 清单1. 鼠标左键点击 Actions action = new Actions(driver);action.click();// 鼠标左键在当前停留的位置做单击操作 action.click(driver.findElement(https://www.wendangku.net/doc/1c14761296.html,(element)))// 鼠标左键点击指定的元素 清单2. 鼠标右键点击 Actions action = new Actions(driver); action.contextClick();// 鼠标右键在当前停留的位置做单击操作 action.contextClick(driver.findElement(https://www.wendangku.net/doc/1c14761296.html,(element)))// 鼠标右键点击指定的元素 清单3. 鼠标双击操作 Actions action = new Actions(driver); action.doubleClick();// 鼠标在当前停留的位置做双击操作
鲁德培训https://www.wendangku.net/doc/1c14761296.html,/软件测试学习 Selenium webdriver教程常用命令汇总 这段时间使用selenium webdriver做UI自动化,积累了一些心得,汇总了常用的命令。 1、查找某个元素是否存在:bot.existElement(By.xpath("//a[contains(text(),'宁波测试商品002')]")) 2、根据xpath断言某个元素是否存在: Assert.assertEquals(bot.findElements(By.xpath("//div[@class='g-group-name']/span")).get(0).getText(),"H1237","合伙人小队页面错误!"); //index从0开始 3、根据classname断言某个元素是否存在: Assert.assertEquals(bot.findElements(By.className("col-name")).get(1).getText(),"赵利群","设置默认地址失 败!"); 4、尝试多种方法定位元素:https://www.wendangku.net/doc/1c14761296.html,()、By.id()、By.className()、By.linkText()、By.xpath()、By.tagName()、By.cssSelector() 5、如果还是定位不到,可能是因为该元素存在iframe里,需要先定位iframe再定位元素: bot.typeInFrame(By.id("yueForm"),By.xpath("//input[@id='OTPCtl2']"),wybpassword); bot.clickInFrame(By.id("yueForm"),By.id("bankCardSumbit")); 6、type失败时,可尝试先使用click点击输入框,然后使用type: bot.click(By.xpath("id('J_streetBox')/textarea"));//点击输入框 bot.type(https://www.wendangku.net/doc/1c14761296.html,("street"), newaddress);//修改地址 7、切换窗口:bot.changeWindow(1);//index从0开始 8、比较跳转后url是否正确:https://www.wendangku.net/doc/1c14761296.html,pareUrl(1,"https://www.wendangku.net/doc/1c14761296.html,/cart.html?from=Repeat_purchase") 9、有时用seleniumIDE可以实现replay操作,但是webdriver不行,增加等待时间或许可以解决问题:bot.wait(5);//0.1秒为单位
项目实战 第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试 通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用所编写的脚本也是这种形式。 脚本一
脚本二 通过上面的两个脚本,我们很明显的发现它的问题: 一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。 这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。 这种模式下脚本的可重复使用率很低。 模块化与库 我们会清晰的发现在上面的脚本中,其实有不少内容是重复的;于是就有了下面的改进。
测试用例: 注意,上面代码并非完整代码,不能运行。 通过上面的代码发现,我们可以把脚本中相同的部分独立出来,形成模块或库;当脚本需要进行调用。这样做有两个好处: 一方面提高了开发效率,不用重复的编写相同的脚本;另一方面提高了代码的复用。 数据驱动 数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起结果改变。这显然是一个非常高级的概念和想法。 其实,我们能做到的是下面的形式。 d:\\
图4 8 = ("D:\\\\", "r") = () () #执行循环 : = () ("") ("")() ..... 不管我们读取的是文件,还是、文件的之类,又或者是数组、字典函数。我们实现了数据与脚本的分离,换句话说,我们实现了参数化。我们仍一千条数据,通过脚本的执行,可以返回一千条结果出来。 同样的脚本执行不同的数据从而得到了不同的结构。是不是增强的脚本的复用性呢! 其实,这对开发来说是完全没有什么技术含量的;对于当初自动化工具来说确是一个买点,因为它面对的大多是不懂开发的测试。
Windows 下安装Selenium Webdriver ·安装ruby 下载地址https://www.wendangku.net/doc/1c14761296.html,/downloads/ 管理员运行:rubyinstaller-2.0.0-p247.exe,安装过程默认。勾选添加Ruby可执行到PATH 安装完成之后,进入命令行(Win+R)。后输入ruby –v gem –v 检测Rubygems是否是最新版本:gem update --system. Gem:类似于apple的app store 这样的东西。我们可以从里面安装所需的软件。例如Watir-Webdriver、selnium-webdriver等等。
·安装Selenium webdriver 控制台输入:gem install selenium-webdriver 查看是否安装成功:命令行输入:gem list selenium-webdriver 卸载方法:gem uninstall selenium-webdriver 查看文档: 1.命令行输入: gem server 2.浏览器输入:http://localhost:8808 3.找到“selenium-webdriver 2.3 4.0[rdoc]”点击rdoc进行相关文档 4. 搭建浏览器开发环境 下载IE driver server https://https://www.wendangku.net/doc/1c14761296.html,/p/selenium/downloads/list 下载Chrome driver https://https://www.wendangku.net/doc/1c14761296.html,/p/chromedriver/downloads/list 将driver文件放到系统的PATH中。(将下载下来的2个文件解压到Ruby的安装路径下的bin目录即可。例如:D:\Ruby200\bin) 注意:解压后的exe程序不可以重命名。 ·配置IE 配置IE的保护模式:工具->Internet选项->安全。4个选项卡要么全勾上,要么全部不勾选。
Selenium webdriver+python的安装 用到的软件以及链接(均为64位), chromedriver链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1lVURjquvwlOZuBRGqFWEQg 密码:0fr3(chrome 版本65.0.3325.181(正式版本)(64 位)) pip 链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1w4HVZhbu1n3slUqkDe53Mg 密码:gawz pycharm链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1BmjjzujsgeRu5ctUngzZxw 密码:vvfh Python2.7 链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1gy9kaG5UokWHmDj2Y01ELA 密码:2fyy selenium3.6 链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1j6i20kFM745Mfow-gloXOg 密码:4k78 setuptools链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1Qm5UUK805mB4BgxJGqaiqg 密码:3ivo jdk链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1Yia54ywSlKuq--jbjj7pgw 密码:ab4b pycharm破解需要的包链接:https://https://www.wendangku.net/doc/1c14761296.html,/s/1Rb9MSIiKfZZCmlBoeMLWsw 密码:huht 准备工作:1.JDK安装省略2.若有提示java出错,查看java配置的环境变量 环境变量 Java_home: C:\Program Files\Java\jdk1.8.0_131 Path: C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMD APP\bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYST EMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;;%JAVA_HOME%\bin;%JAVA_HOME%\jre7\bin;D:\Progr am Files\TortoiseSVN\bin;C:\strawberry\c\bin;C:\strawberry\perl\bin;C:\Program Files (x86)\PICT\;D:\Python27;D:\Python27\Scripts;C:\Program Files (x86)\Google\Chrome\Application;D:\Python27\Scripts;D:\Python27;D:\Python27\Lib \site-packages\setuptools-36.5.0-py2.7.egg;D:\Program Files\JetBrains\PyCharm 2017.2.3\bin 一、安装Python以及配置环境变量 1.安装python
(三) 命令和操作 这一部分将介绍一下WebDriver的一些具体操作和命令,实际操作中,我们需要两大工具来帮助我们:FireBug和Xpath工具,这两者都是Firefox上的插件。接下来我们所讲解的都是以FirefoxDriver为基础的,且基于WebDriver driver = new FirefoxDriver();创建的一个driver实例: a) 访问一个页面 第一件你想使用WebDriver做的事情肯定是访问一个页面,最基础的方法是调用“get”方法: driver.get("https://www.wendangku.net/doc/1c14761296.html,"); 同样我们可以使用: driver.navigate().to("https://www.wendangku.net/doc/1c14761296.html,"); WebDriver会自动等待到该页面完全加载才执行接下来的测试和脚本的执行。但是如果你的页面存在很多的AJAX加载,此时WebDriver是无法知道是否完成加载。检查此类页面是否加载完成,那么我们就需要Explicit和Implicit Wait(这两个将在后面文章解释)。 b) 定位UI元素 WebDriver可以通过WebDriver实例来定位元素,任何语言库都含有“Find Element”和“Find Elements”的方法。第一个方法返回一个WebElement或者抛出异常。后者返回
所有WebElement的列表,或者空列表。 获取和定位元素我们调用“By”方法。下面具体解释下“By”方法: By ID 这是一个极为有效定位元素的方法。普遍的现状是UI工程师在实际编写页面时很少写id或者自动生产一个ID,这些都是需要避免的。对于一个页面Element来说,class比自动生产的id更好。 通过id定位元素的例子:
Windows下安装Selenium Webdriver ·安装ruby 下载地址https://www.wendangku.net/doc/1c14761296.html,/downloads/ 管理员运行:rubyinstaller-2.0.0-p247.exe,安装过程默认。勾选添加Ruby可执行到PATH 安装完成之后,进入命令行(Win+R)。后输入ruby–v gem–v 检测Rubygems是否是最新版本:gem update--system. Gem:类似于apple的app store这样的东西。我们可以从里面安装所需的软件。例如Watir-Webdriver、selnium-webdriver等等。
·安装Selenium webdriver 控制台输入:gem install selenium-webdriver 查看是否安装成功:命令行输入:gem list selenium-webdriver 卸载方法:gem uninstall selenium-webdriver 查看文档: 1.命令行输入:gem server 2.浏览器输入:http://localhost:8808 3. 4. 搭建浏览器开发环境 下载IE driver server https://https://www.wendangku.net/doc/1c14761296.html,/p/selenium/downloads/list 下载Chrome driver https://https://www.wendangku.net/doc/1c14761296.html,/p/chromedriver/downloads/list 将driver文件放到系统的PATH中。(将下载下来的2个文件解压到Ruby的安装路径下的bin目录即可。例如:D:\Ruby200\bin) 注意:解压后的exe程序不可以重命名。 ·配置IE 配置IE的保护模式:工具->Internet选项->安全。4个选项卡要么全勾上,要么全部不勾选。
(一) Selenium2.0 VS Selenium1.0 我们已经有了Selenium1.0为什么还需要Selenium2.0呢? Selenium1.0不能处理一下事件: 1) 本机键盘和鼠标事件 2) 同源策略XSS/HTTP(S) 3) 弹出框,对话框(基本身份认证,自签名的证书和文件上传/下载) Selenium2.0有简洁的API,WebDriver和WebElement对象,更好的抽象。且支持多中操作系统,多语言,多浏览器。 同时Selenium2.0进行了架构的调整和升级: Selenium2.0 = Selenium1.0 + WebDriver(也就是说Selenium2.0合并了这两个项目) Selenium1.0可以使用任何编程语言,但是有个先决条件就是必须支持HTTP库。Selenium1.0起初就是一个Javascript库,到后面引入了SeleniumRC。SeleniumRC作为一个代理服务器并且发送操作命令给Selenium Core(javascript代码,且为SeleniumRC 的一部分)。SeleniumRC从测试程序接收指令并翻译,返回测试结果给测试程序。Selenium Core在client API打开浏览器后就注入到浏览器中,然后Selenium Core接收测试程序的指令,解释成selenese命令,在浏览器执行。 Selenium1.0作为第一个基于javascript开源的web测试框架,迅速的得到了其他浏览器的支持。但是和任何其他大项目一样,Selenium1.0也不是完美的。正因为他完全是使用javascript写的,这也给他带来了致命的缺陷。为了防止恶意的javascript,所有浏览器都加强了对javascript的安全策略。这样势必导致了在一些特定场景无法使用Selenium1.0。作为一个大项目,随着时间的日积月累,Selenium1.0的API变得越来也大,也越来也复杂,导致了都不知道更好的使用它改善它。 WebDriver项目是由Simon Stewart提出的,它是一个轻便简洁的自动化测试框架。WebDriver通过尝试不同的方法去解决Selenium1.0所面临的问题。不单单是使用javascript,WebDriver会使用任何一种更合适的机制来操作浏览器。IE通过使用C++,FF 通过使用javascript in a XPCOM component。 通过更灵活的机制去操控浏览器,那我们就能很好的绕过浏览器javascript的安全限制。当这些技术还不够用时,我们可以调用系统设备操作,尤其是当你需要一些键盘和鼠标操作时,通过这些技术,我们可以更好的模拟用户的真实浏览器操作。 当这两个框架被合并后,一个框架的缺陷被另一个框架所弥补。WebDriver对浏览器的支持需要对应框架开发工程师做对应的开发;同样Selenium必须操作真实浏览器,但是WebDriver可以HTML unit Driver来模拟浏览器,在内存中执行用例,更加的轻便。Selenium1.0解决了自动化测试中的一些常见问题,WebDriver更好的解决了沙箱限制。WebDriver不支持并行,但是Selenium Grid解决了这个问题。
使用webdriver与Selenium1.0实现主页面跳转到子页面后又回到主页面的操作案例 package com.example.tests; import com.thoughtworks.selenium.Selenium; import com.thoughtworks.selenium.SeleneseTestCase; import mx4j.tools.config.DefaultConfigurationBuilder.New; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.remote.RemoteWebDriver; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriverBackedSelenium; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.*; import java.util.regex.Pattern; import java.util.Iterator; public class Baidutest extends SeleneseTestCase { private WebDriver driver = new FirefoxDriver(); @Before public void setUp() throws Exception { String baseUrl = "https://www.wendangku.net/doc/1c14761296.html,/"; selenium = new WebDriverBackedSelenium(driver, baseUrl); } @Test public void testBaidutest() throws Exception { driver.get("https://www.wendangku.net/doc/1c14761296.html,/"); System.out.println("url0 = " + driver.getCurrentUrl()); String url0 = driver.getCurrentUrl(); selenium.click("link=百度"); Thread.sleep(3000); //输出当前页面的链接 System.out.println("url01 = " + driver.getCurrentUrl());
selenium webdriver(python) (第一版) 声明: 本文档以免费形式传播,禁止用于任何商业用途,如果要用于商业请联系作者,欢迎一切免费形式的传播,请著名博客园--虫师的信息。
前言 如果你是一位有python语言基础的同学,又想通过python+selenium去实施自动化,那么你非常幸运的找到了这份文档,我也非常荣幸能为你的自动化学习之路带来一丝帮助。 其实,我在selenium自动化方面也是初学者,虽然在刚开始从事测试工作的就尝试学习selenium自动化工具,购买了面《零成本实现web自动化测试---基于seleinum与Bromine》学了一段时间不得门,当时水平有限,甚至一直都不理解什么自动化测试框架,后来就放弃了自动化的学习。 今年换工作后,所测试的项目用python开发,为了更好的测试项目,开始学习python 语言,花一个月多月的时候将python基础学习了一下。正好所测试的项目也比较适合进行自动化,于是尝试通过python+selenium对项目进行自动化工作。 学习的过程还是比较艰难的,对于selenium webdriver的ruby和java的实例比较多,python甚少,查询API文档有方法,但没有实例,不知道如何实现。在学习过程中要感谢乙醇同学,他在ruby+selenium方面有很深的功力;另一位要感谢的是rabbit,他在python+selenium的学习中给我了很多帮助。 下面要简单说说本文档的内容: 为了学习selenium webdriver本身的用法,全文没有引入python的unittest测试框架;所有的脚本也都是单个的用例的学习,引入框架后将会提供更强大的功能,比如用例的运行时间,用例的批量执行等。本文档是第一版,我此后也会继续学习unittest测试框架的技术,并将在第二版中加入。 本文档不是API,所以还有很多方法没有整理,如果在学习的过程中有任何疑问,请查阅在线AIP文档: https://www.wendangku.net/doc/1c14761296.html,/git/docs/api/py/index.html 2013.8.30
WebDriver: 高级用法 显式和隐式等待 等待是在执行下一步骤之前让自动任务等定量的时间。 显示等待 一个显式等待就是在继续执行代码之前编码等待定义一个特定条件发生。最糟糕的例子是Thread.sleep(),这设置了一个准确的等待时间。WebDriver提供了一些方便的方法帮助您些代码来等待要求的时间。WebDriverWait和ExpectedCondition的结合就是一种实现的方法。WebDriver driver = new FirefoxDriver(); driver.get("http://somedomain/url_that_delays_loading"); WebElementmyDynamicElement = (new WebDriverWait(driver, 10)) .until(new ExpectedCondition
python webdriver 项目实战
第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试 通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。 脚本一 脚本二
通过上面的两个脚本,我们很明显的发现它的问题: 一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。 这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。 这种模式下脚本的可重复使用率很低。 模块化与库 我们会清晰的发现在上面的脚本中,其实有不少容是重复的;于是就有了下面的改进。 login.py quit.py 测试用例:
注意,上面代码并非完整代码,不能运行。 通过上面的代码发现,我们可以把脚本中相同的部分独立出来,形成模块或库;当脚本需要进行调用。这样做有两个好处: 一方面提高了开发效率,不用重复的编写相同的脚本;另一方面提高了代码的复用。 数据驱动 数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起结果改变。这显然是一个非常高级的概念和想法。 其实,我们能做到的是下面的形式。 d:\abc\data.txt
图4.x #coding=utf-8 from selenium import webdriver import os,time source = open("D:\\abc\\data.txt", "r") values = source.readlines() source.close() #执行循环 for serch in values: driver = webdriver.Firefox() driver.get(".xxxx.") driver.find_element_by_id("kw").send_keys(serch) ..... 不管我们读取的是txt 文件,还是csv、excel 文件的之类,又或者是数组、字典函数。我们实现了数据与脚本的分离,换句话说,我们实现了参数化。我们仍一千条数据,通过脚本的执行,可以返回一千条结果出来。 同样的脚本执行不同的数据从而得到了不同的结构。是不是增强的脚本的复用性呢! 其实,这对开发来说是完全没有什么技术含量的;对于当初QTP 自动化工具来说确是一个买点,因为它面对的大多是不懂开发的测试。