WebDriver常用操作

配置driver:

  System.setProperty("webdriver.chrome.driver","E:\\webDriver\\chromedriverV2.28.exe");
	//chromedriver服务地址
    WebDriver driver =new ChromeDriver(); 
    //新建一个WebDriver 的对象,但是new 的是FirefoxDriver的驱动
    driver.get("http://www.baidu.com");//打开指定的网站

关闭浏览器
场景
在脚本运行完毕或者测试代码结束的时候关闭浏览器是非常自然的事情,就像在吃完饭后就把餐桌收拾干净一样。

关闭浏览器有两种方式:

close方法

quit方法

close方法关闭当前的浏览器窗口,quit方法不仅关闭窗口,还会彻底的退出webdriver,释放与driver server之间的连接。所以简单来说quit是更加彻底的close,quit会更好的释放资源,适合强迫症和完美主义者。

WebDriver dr = new ChromeDriver();
		System.out.println("browser will be closed");
		dr.quit();

设置浏览器大小

dr.manage().window().setSize(new Dimension(320, 240));

打印当前页面的title及url

dr.getTitle();
dr.getCurrentUrl();

前进和后退

dr.navigate().forward();
dr.navigate().back();

简单的对象定位

	//		by id
		dr.findElement(By.id("inputEmail")).click();
		Thread.sleep(1000);
		
//		by name
		dr.findElement(By.name("password"));
		Thread.sleep(1000);
		
//		by tagname
		String classOfForm = dr.findElement(By.tagName("form")).getAttribute("class");
		System.out.printf("%s\n", classOfForm);
		Thread.sleep(1000);
		
//		by link text
		WebElement link = dr.findElement(By.linkText("register"));
		((JavascriptExecutor)dr).executeScript("$(arguments[0]).fadeOut().fadeIn()", link);
		Thread.sleep(1000);

//		by partial link test
		WebElement sameLink = dr.findElement(By.partialLinkText("reg"));
		((JavascriptExecutor)dr).executeScript("$(arguments[0]).fadeOut().fadeIn()", sameLink);
		Thread.sleep(1000);
		
//		by css selector
		WebElement div = dr.findElement(By.cssSelector(".controls"));
		((JavascriptExecutor)dr).executeScript("$(arguments[0]).fadeOut().fadeIn()", div);
		Thread.sleep(1000);
		
//		by xpath
		dr.findElement(By.xpath("/html/body/form/div[3]/div/label/input")).click();
		Thread.sleep(1000);

滚动条

JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript(""arguments[0].scrollIntoView(false);", target);

参数为true时调用该函数,页面(或容器)发生滚动,使element的顶部与视图(容器)顶部对齐; 参数为false时,使element的底部与视图(容器)底部对齐。

定位一组对象

List<WebElement> inputs = dr.findElements(By.tagName("input"));
		for(WebElement input : inputs){
			if(input.getAttribute("type").equals("checkbox")){
				input.click();
			}
		}

send keys模拟按键输入

//		copy content of A
		dr.findElement(By.id("A")).sendKeys(Keys.chord(Keys.CONTROL + "a"));
		Thread.sleep(1000);
		dr.findElement(By.id("A")).sendKeys(Keys.chord(Keys.CONTROL + "x"));
		
//		paste to B
		dr.findElement(By.id("B")).sendKeys(Keys.chord(Keys.CONTROL + "v"));

等待元素显示
一、显式等待
WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
dr.findElement(By.linkText(“Info”)).click();

		(new WebDriverWait(dr, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d){
				return d.findElement(By.className("dropdown-menu")).isDisplayed();
			}
		});

二、隐性等待.
implicitly_wait(xx),隐性等待的意义是置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

获取测试对象的属性及内容

		WebElement link = dr.findElement(By.id("tooltip"));
		
//		获得tooltip的内容
		link.getAttribute("data-original-title");
		
//		获取该链接的text
		link.getText();

获取测试对象的css属性

		WebElement link = dr.findElement(By.id("tooltip"));
		
		System.out.println(link.getCssValue("color"));
		
		System.out.println(dr.findElement(By.tagName("h3")).getCssValue("font"));	

获取测试对象的状态

  • 是否显示。使用element.isDisplayed()方法;
  • 是否存在。使用findElement方法,捕获其抛出的异常,如果是NoSuchElementException的话则可以确定该元素不存在;
  • 是否被选中。一般是判断表单元素,比如radio或checkbox是否被选中。使用element.isSelected()方法;
  • 是否enable,也就是是否是灰化状态。使用element.isEnabled()方法;
		WebElement textField = dr.findElement(By.name("user"));
		System.out.println(textField.isEnabled());
		
//		直接用isEnabled方法去判断该button的话返回的会是true
//		这是因为button是使用css方法去disabled的,并不是真正的disable
//		这时候需要判断其class里是否有disabled这值来判断其是否处于disable状态
		System.out.println(dr.findElement(By.className("btn")).isEnabled());
		
//		隐藏掉textField
//		判断其是否显示
		((JavascriptExecutor)dr).executeScript("$(arguments[0]).hide()", textField);
		System.out.println(textField.isDisplayed());
		
//		使用click方法选择raido
		WebElement radio = dr.findElement(By.name("radio"));
		radio.click();
		System.out.println(radio.isSelected());
		
		try{
			dr.findElement(By.id("none"));
		} catch(NoSuchElementException e){
			System.out.println("element does not exist");
		}
		
//声明一个WebDriverWait对象,设定复发条件的最长时间待定10s
  WebDriverWait wait = new WebDriverWait(driver,10);
  //调用ExpectedConditions的titleContains方法判断页面title属性是否包含"fruits"字段
  wait.until(ExpectedConditions.titleContains("fruits"));

  WebElement select = driver.findElement(By.xpath("//option[@id='peach']"));
  //elementToBeSelected(Element element)判断"peach"是否被选中
  wait.until(ExpectedConditions.elementToBeSelected(select));

  //elementToBeClickable(String )判断复选框对象是否可以被点击
  wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//p")));

  //presenceOfElementLocated 判断元素是否存在
  wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//x")));

  //textToBePresentInElement判断字样是否在元素中显示
  WebElement p = driver.findElement(By.xpath("//p"));
  wait.until(ExpectedConditions.textToBePresentInElement(p, "select ur perfer fruit"));

form的操作

表单对象的操作比较简单,只需要记住下面几点
使用sendKeys方法往多行文本框和单行文本框赋值;
使用click方法选择checkbox
使用click方法选择radio
使用click方法点击button
使用click方法选择option,从而达到选中select下拉框中某个具体菜单项的效果

执行js

	//		在页面上直接执行js
		((JavascriptExecutor)dr).executeScript("$('#tooltip').fadeOut();");
		Thread.sleep(1000);
		
//		在已经定位的元素上执行js
		WebElement button = dr.findElement(By.className("btn"));
		((JavascriptExecutor)dr).executeScript("$(arguments[0]).fadeOut();", button);

处理alert/confirm/prompt
webdriver中处理原生的js alert confirm 以及prompt是很简单的。具体思路是使用switch_to.alert()方法定位到alert/confirm/prompt。然后使用text/accept/dismiss/send_keys按需进行操做

getText。返回alert/confirm/prompt中的文字信息
accept。点击确认按钮
dismiss。点击取消按钮,如果有的话
sendKeys。向prompt中输入文字

	//		点击链接弹出alert
		dr.findElement(By.id("tooltip")).click();
		
		Alert alert = dr.switchTo().alert();
		alert.accept();

定位frame中的元素
处理frame需要用到2个方法,分别是switchTo().frame(element|index|id)和switchTo.defaultContent()

switchTo().frame()方法的参数值得一提。其支持

WebElement, 可以传入一个已经定位的frame元素。如 switchTo().frame(dr.findElement(By.id(“myFrame”)))
int index, 可以传入页面上frame的索引,如0表示第1个frame
String id, 可以传入frame的id
switchTo().frame()方法把当前定位的主体切换了frame里。怎么理解这句话呢?我们可以从frame的实质去理解。frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此才需要用switch_to.frame方法去获取frame中嵌入的页面,对那个页面里的元素进行定位。

switchTo.defaultContent方法的话则是从frame中嵌入的页面里跳出,跳回到最外面的原始页面中。

	//		 先到f1再到f2
		dr.switchTo().frame("f1");
		dr.switchTo().frame("f2");
//		往f2中的百度关键字文本框中输入内容
		dr.findElement(By.id("kw")).sendKeys("watir-webdriver");
		Thread.sleep(1000);
		
//		直接跳出所有frame
		dr.switchTo().defaultContent();

action
场景
由于webdriver是要模拟真实的用户操作,因此webdriver的Action类中提供了很多与操作有关的方法。

下面列举一下Action类的一些主要方法

keyDown。模拟按键按下
keyUp。模拟按键弹起
click
sendKeys
doubleClick。鼠标左键双击
clickAndHold。鼠标左键点击住不放
release。鼠标左键弹起,可以与click_and_hold配合使用
moveToElement。把鼠标移动到元素的中心点
contextClick。鼠标右键点击
dragAndDrop。拖拽

11.拖拉(Drag andDrop)

WebElement element =driver.findElement(By.name("source")); 
WebElement target = driver.findElement(By.name("target")); 
(new Actions(driver)).dragAndDrop(element, target).perform(); 

超时设置
场景
webdriver中可以设置很多的超时时间

implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常
setScriptTimeout。异步脚本的超时时间。webdriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间
pageLoadTimeout。页面加载时的超时时间。因为webdriver会等页面加载完毕在进行后面的操作,所以如果页面在这个超时时间内没有加载完成,那么webdriver就会抛出异常

  # 定位对象时给3s的时间
  # 如果3s内还定位不到则抛出异常
 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

 # 页面加载超时时间设置为5s
 dr.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);

 # 异步脚本的超时时间设置成3s 
 dr.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);

Remote Webdriver
场景
简单来说,我们可以把remote webdriver理解成在远程机器上运行webdriver脚本。

想像一下最简单的一个应用场景:你和你的同事两人一起开发一段webdriver脚本,然后你们需要在一个公共的环境去运行这段脚本。为什么要在公共的环境运行?那是因为每个人的开发机器是有差异的,但是如果用同一台测试机的话,那么环境差异的因素就可以基本排除。我们应该经常听到开发说这样的话:“这个bug在我的环境上是好的啊!”。因为运行环境不同而造成的bug比比皆是,因此我们需要一个统一的运行环境来消除差异。

在这样的应用场景下,我们就需要使用remote webdriver,我们在本地开发脚本,然后调用remote webdriver,在测试机器上执行我们的测试。
截图

/**
	 * 截屏操作
	 * 图片已当前时间命名
	 */
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");  //转换时间格式
	String time = dateFormat.format(Calendar.getInstance().getTime());  //获取当前时间
	File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);  //执行屏幕截取
	FileUtils.copyFile(srcFile, new File("屏幕截图", time + ".png")); //利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件;"屏幕截图"即时保存截图的文件夹

作者:lykion_881210
来源:CSDN
原文:https://blog.csdn.net/lykio_881210/article/details/79125808
版权声明:本文为博主原创文章,转载请附上博文链接!
安装
Remote Webdriver的安装很简单。

首先下载selenium-server-standalone-LAST-VERSION.jar。

然后运行java -jar selenium-server-standalone.jar命令。如果没有错误出现的话,这台机器已经被配置成远程机器了,以后webdriver就会在这台机器上启动浏览器,执行脚本。

启动driver
下面的代码可以启动远程机器上的driver,默认情况下这会打开localhost也就是本机上的firefox浏览器

driver = Selenium::WebDriver.for(:remote)

如果你的remote webdriver不在本地运行,而且你又想指定除firefox以外的浏览器,那么使用下面的代码

driver = Selenium::WebDriver.for(:remote, :url => "http://myserver:4444/wd/hub", :desired_capabilities => :chrome)

通常情况下myserver可以是192.168.x.x之类的ip地址。

另外还可以通过配置Selenium::WebDriver::Remote::Capabilities来实现更加定制化的浏览器配置,这个超出本文范围,不做描述。

使用watir-webdriver启动driver
可以使用下面的代码让watir-webdriver也使用remote webdriver模式

browser = Watir::Browser.new(:remote, {desired_capabilities: :chrome, url: "http://myserver:4444/wd/hub"})

java版本
// We could use any driver for our tests…
DesiredCapabilities capabilities = new DesiredCapabilities();

// ... but only if it supports javascript
capabilities.setJavascriptEnabled(true);

// Get a handle to the driver. This will throw an exception
// if a matching driver cannot be located
WebDriver driver = new RemoteWebDriver(capabilities);

// Query the driver to find out more information
Capabilities actualCapabilities = ((RemoteWebDriver) driver).getCapabilities();

// And now use it
driver.get("http://www.google.com");

注意,java版本的代码我没有时间去调试,这里只是把wiki上的代码放出来而已。另外remote server在发生错误时会自动截图,下面是获得截图的代码

public String extractScreenShot(WebDriverException e) {
	Throwable cause = e.getCause();
	if (cause instanceof ScreenshotException) {
		return ((ScreenshotException) cause).getBase64EncodedScreenshot();
	}
	return null;
}

python版本
c = webdriver.DesiredCapabilities.CHROME
driver = webdriver.Remote(command_executor=‘http://127.0.0.1:4444/wd/hub’, desired_capabilities=c)
注意,python binding的wiki中使用的启动remote webdriver的代码跟我上面给出的不太相同,可能是因为我的selenium版本较低(30),最新版本的同学可以试试wiki上的代码。
cookie

webdriver可以读取并添加cookie。有时候我们需要验证浏览器中是否存在某个cookie,因为基于真实的cookie的测试是无法通过白盒和集成测试完成的。

另外更加常见的一个场景是自动登陆。有很多系统的登陆信息都是保存在cookie里的,因此只要往cookie中添加正确的值就可以实现自动登陆了。什么图片验证码、登陆的用例就都是浮云了。

webdriver读写cookie的接口有以下一些

addCookie(Cookie cookie)。添加cookie,参数是Cookie对象
deleteAllCookies。删除所有cookie
getCookies。返回所有的cookie
deleteCookieNamed(String name)。删除name这个cookie
getCookieNamed(String name)。返回特定name的cookie值

   	dr.manage().deleteAllCookies();
    Cookie c1 = new Cookie("BAIDUID", "xxxxxxxxxx");
    Cookie c2 = new Cookie("BDUSS", "xxxxxxxxxx");
    dr.manage().addCookie(c1);
    dr.manage().addCookie(c2);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Selenium-Webdriver系列教程 Selenium 1.x时代已经远去,它理应躺在历史的角落里,靠着壁炉烤着火,抽着旱烟,在袅袅的升起的青烟中回忆那曾经属于自己的美好时代。 不过事实却并非如此,现今原本早应退役的selenium 1.x却还是多数人坚定的选择,究其原因不过是1.x时代遗留下了大量的文档,代码,教程让人们误以为1.x还是这个年代的主流,还应该光鲜亮丽在前台演出属于它的美好。长江后浪推前浪,最为前浪的selenium 1.x的宿命应该是死在沙滩上。 好了,直入主题,由于开源社区不再维护selenium 1.x再加之更为先进的selenium 2.0确实有不少优势之初可以完全取代1.x,在这里笔者会花一些笔墨,若干篇幅,争取深入浅出的讲解selenium 2.0的一些基本知识,常用方法和高级扩展,但由于笔者水平和时间精力等确实有限,文中应该避免不了谬误和臆断之处,还望众位读者多多海涵。 本文中所以代码和示例均由Ruby编写,本文介绍的webdriver api也主要是ruby binding。所以首先请确保ruby语言在开发环境上正确安装。 教程的第一节从selenium 2.0和webdriver关系说起。 Selenium 2.0 和webdriver之间有什么关系,有什么不可告人的秘密?说来话长,但也简单。Selenium 2.0其实就是webdriver。就像张飞就是张翼德,关羽就是关云长一样,叫法不同但内容却是一样的。 安装selenium webdriver • 安装ruby1.8.7或1.9.2。注意selenium-webdriver只支持1.8.7以上的ruby版本; • 使用gem安装selenium-webdriver;打开命令行,输入下列代码完成安装。注意,如果你的开发环境需要http proxy的话,请注意在gem命令中加入--http_proxy参数; gem install selenium-webdriver [--http_proxy] • 在命令行中输入gem list,如果selenium-webdriver正确安装,则其应该出现在结果列表里。在文本写作时,selenium webdriver的最新版本应该是2.2.0; gem list selenium-webdriver 安装firefox。本文使用firefox作为测试浏览器进行讲解,所以请确保开发环境上正确安装了firefox。由于firefox版本更新较快,我们只需要选择1个稳定版本安装既可,本文中笔者使用的版本是FF 5.0;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值