Selenium webdriver 高级应用
对于这一段还蛮有感慨的,只想说,代码还是需要自己去敲的。
1. 改变用户代理
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile; public class ProxyTest {
static WebDriver driver; @BeforeClass
public static void beforeClass(){
//代理的IP和端口
String proxyIP="192.168.12.0";
int proxyPort=80;
FirefoxProfile profile=new FirefoxProfile();
//使用代理
profile.setPreference("network.proxy.type", 1);
//配置“HTTP代理:(N)”
profile.setPreference("network.proxy.http", proxyIP);
profile.setPreference("network.proxy.http_prot", proxyPort);
//选中 “为所有协议使用相同代理(S)” 选框
profile.setPreference("network.proxy.share_proxy_settings", true);
//配置“不使用代理:(N)”文本框
profile.setPreference("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
//以代理的方式启动火狐
driver=new FirefoxDriver(profile);
} @Test
public void test() {
driver.get("http://www.baidu.com");
} @AfterClass
public static void afterClass(){
//driver.quit();
}
}
运行之后,在打开的火狐上查看代理设置(选项->高级->网络->连接->设置),显示如下:
友情提示:测试完之后一定要改回来。默认是“使用系统代理设置”。
2.读取Cookies
增加cookie:
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);
获取cookie的值:
Set<Cookie> allCookies = driver.manage().getCookies();
根据某个cookie的name获取cookie的值:
driver.manage().getCookieNamed("cookieName");
删除cookie:
driver.manage().deleteCookieNamed("CookieName");
driver.manage().deleteCookie(loadedCookie);
driver.manage().deleteAllCookies();
下面是一个例子:
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; public class CookieTest {
WebDriver driver; @Before
public void setUp() throws Exception {
driver=new FirefoxDriver();
} @After
public void tearDown() throws Exception {
driver.quit();
} @Test
public void test() {
printCookie();
//添加一个cookie
Cookie cookie=new Cookie("s","selenium");
driver.manage().addCookie(cookie);
printCookie();
//删除一个cookie
driver.manage().deleteCookie(cookie); //driver.manage().deleteCookieNamed("s");也可以
printCookie();
} public void printCookie(){
//获取并打印所有的cookie
Set<Cookie> allCookies=driver.manage().getCookies(); System.out.println("----------Begin---------------");
for(Cookie c:allCookies){
System.out.println(String.format("%s->%s",c.getName(),c.getValue()));
}
System.out.println("----------End---------------");
}
}
运行结果显示为:
----------Begin---------------
----------End---------------
----------Begin---------------
s->selenium
----------End---------------
----------Begin---------------
----------End---------------
可以看到添加cookie之前,系统的cookie为空。之后成功添加了cookie(s,selenium)并且最后成功删除。
3. 调用Java Script
selenium提供了executeScript
、executeAsyncScript
两个方法来处理JS调用的问题。其中executeScript
是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕;executeAsyncScript
方法是异步方法,它不会阻塞主线程执行。
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.JavascriptExecutor; public class JSTest {
@Test
public void test() {
WebDriver driver=new FirefoxDriver();
driver.get("http://www.baidu.com");
JavascriptExecutor js=(JavascriptExecutor)driver;
js.executeScript("document.getElementById(\"kw\").value=\"selenium\"");
//利用js代码获取百度搜索框内文字
String keyword = (String) (js.executeScript("var input = document.getElementById(\"kw\").value;return input"));
System.out.println(keyword);
driver.quit();
}
}
运行结果:
selenium
4. Webdriver截图
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; public class ScreenShotTest { @Test
public void test() {
WebDriver driver=new FirefoxDriver();
driver.get("http://www.baidu.com");
screenShot("selenium.jpg", (TakesScreenshot)driver);
driver.quit();
} public static void screenShot(String name,TakesScreenshot driver){
String savaPath=System.getProperty("user.dir");
File sourceFile=driver.getScreenshotAs(OutputType.FILE);
try{
System.out.println("Begin saving screenshot to path:"+savaPath);
FileUtils.copyFile(sourceFile, new File(savaPath+"\\"+name));
} catch(IOException e){
System.out.println("Save screenshot failed!");
e.printStackTrace();
} finally{
System.out.println("Finish screenshot!");
}
}
}
运行结果:
Begin saving screenshot to path:D:\workspace_luna\SeleniumDemo
Finish screenshot!
由于eclipse的workspace不一样,会导致上面的路径不一样。不过没关系,我们打开对应的路径就可以看到selenium.jpg。打开以后是百度首页的截图。
5. 页面等待
因为Load页面需要一段时间,如果页面还没加载完就查找元素,必然是查找不到的。最好的方式,就是设置一个默认等待时间,在查找页面元素的时候如果找不到就等待一段时间再找,直到超时。Webdriver提供两种方法,一种是显性等待,另一种是隐性等待。
显性等待:
显示等待就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));
当然也可以自己重写内部类:
WebElement e = (new WebDriverWait( driver, 10)).until(
new ExpectedCondition< WebElement>(){
@Override
public WebElement apply( WebDriver d) {
return d.findElement(By.linkText("Selenium_百度百科"));
}
});
下面的例子是:打开百度,搜索“selenium",等待搜索结果里出现“Selenium_百度百科”的时候点击该链接。
import org.junit.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.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait; public class ExplicitWaitTest {
@Test
public void test() {
WebDriver driver=new FirefoxDriver();
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("selenium");
driver.findElement(By.id("su")).click();
//方法一
//new WebDriverWait(driver,10).until(ExpectedConditions.presenceOfElementLocated(By.linkText("Selenium_百度百科")));
//driver.findElement(By.linkText("Selenium_百度百科")).click();
//方法二
WebElement e = (new WebDriverWait( driver, 10)).until(
new ExpectedCondition< WebElement>(){
@Override
public WebElement apply( WebDriver d) {
return d.findElement(By.linkText("Selenium_百度百科"));
}
}
);
e.click(); driver.quit();
}
}
运行的话是通过的,但是如果中间不显示等待的话,直接查找就会fail。
隐性等待:
隐形等待只是等待一段时间,元素不一定要出现,只要时间到了就会继续执行。
还是上面的例子,用隐性等待写就是:
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; public class ImplicitWaitTest {
@Test
public void test() {
WebDriver driver=new FirefoxDriver();
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("selenium");
driver.findElement(By.id("su")).click();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.findElement(By.linkText("Selenium_百度百科")).click(); driver.quit();
}
}
运行结果还是通过的。不过个人觉得看起来跟笨方法”Thread.sleep()"差不多,只不多比它更高效了而已。
Selenium webdriver 高级应用的更多相关文章
- Selenium WebDriver高级用法
Selenium GitHub地址 选择合适的WebDrvier WebDriver是一个接口,它有几种实现,分别是HtmlUnitDrvier.FirefoxDriver.InternetExplo ...
- Selenium WebDriver高级应用
WebDriver高级应用 public class Demo4 { WebDriver driver; // @BeforeMethod:在每个测试方法开始运行前执行 @BeforeMethod p ...
- Selenium webdriver Java 高级应用
对于这一段还蛮有感慨的,只想说,代码还是需要自己去敲的. 1. 改变用户代理 import org.junit.AfterClass; import org.junit.BeforeClass; im ...
- Python3 Selenium自动化web测试 ==> 第八节 WebDriver高级应用 -- 结束Windows中浏览器的进程
学习目的: 掌握WebDriver的高级应用 正式步骤: # -*- coding:utf-8 -*- from selenium import webdriver from selenium.web ...
- Python3 Selenium自动化web测试 ==> 第七节 WebDriver高级应用 -- 浮动框中,单击选择某个关键字选项
学习目的: 了解WebDriver的高级应用 正式步骤: 测试Python3代码 # -*- coding:utf-8 -*- from selenium import webdriver from ...
- Python3 Selenium自动化web测试 ==> 第十一节 WebDriver高级应用 -- 显示等待 + 二次封装
学习目的: 掌握显示等待 掌握二次封装 正式步骤: step1:显示等待的代码示例 # -*- coding:utf-8 -*- from selenium import webdriver from ...
- Python3 Selenium自动化web测试 ==> 第九节 WebDriver高级应用 -- 操作select 和 alert
学习目的: 掌握页面常规元素的定位方法 场景: 网页正常的select元素下拉框常规方法和select专属方法 正式步骤: step1:常规思路select页面元素定位 处理HTML代码截图 # -* ...
- Python3 Selenium自动化web测试 ==> 第六节 WebDriver高级应用 -- 操作web页面的滚动条
学习目的: 掌握页面元素定位以外的其他重要知识点. 正式步骤: 测试Python3代码 # -*- coding:utf-8 -*- from selenium import webdriver fr ...
- Python3 Selenium自动化web测试 ==> 第五节 WebDriver高级应用 -- 使用JavaScript操作页面元素
学习目的: 中级水平技术提升 在WebDriver脚本代码中执行JS代码,可以解决某些 .click()方法无法生效等问题 正式步骤: Python3代码如下 # -*- coding:utf-8 - ...
随机推荐
- IDL实现主成分变化(PCA)
IDL只能通过调用envi的二次接口做图像的变换,但是对于普通的数据没有提供函数.根据主成分变换的原理,用IDL写出来了,这样就不用每次再去用matlab的princomp去做了.主成分变化的基本过程 ...
- 不用jquery等框架实现ajax无刷新登录
<script type="text/javascript"> window.onload = function () { document.getElementByI ...
- 【开源java游戏框架libgdx专题】-15-系统控件-Button类
Button类继承与Actor类,可以在舞台中使用,但是它也继承了许多Actor的子类,如Group.Table.WidgetGroup灯. 常用构造方法: Button():创建按钮对象,不设置其样 ...
- 《第一行代码》学习笔记1-Android系统架构
1. 2003.10,Andy Rubin创办Android公司.2005.8,Google收购之,并于2008年推出Android系统第一个版本. 2. ①Linux Kernel:基于Linux ...
- leetcode修炼之路——350. Intersection of Two Arrays II
题目如下: Given two arrays, write a function to compute their intersection. Example: Given nums1 = [1, 2 ...
- get the text value of a selected option.
<select id="myselect"> <option value="1">Mr</option> <optio ...
- javascript 操作符类型隐性转换
javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...
- [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
引言 贴一个grid 的例子先: 有这样一个需求: 1. 给 Grid(or Tree Grid)添加一列, 这一列显示是Button. 点击之后可以对这一行进行一些操作 2. 这一列每一行对应的按钮 ...
- 初涉JavaScript模式 (2) : 基本技巧
尽量少用全局变量 大量使用全局变量会导致的后果 全局变量创建以后会在整个JavaScript应用和Web页面中共享.所有的全局变量都存在于一个全局命名空间内,很容易发生冲突 不知不觉创建了全局变量 其 ...
- [javascript]event属性
1.clientX和clientY clientX和clientY是事件发生时,鼠标离浏览器可视文档区域左上角的位置 2.offsetX和offsetY offsetX和offsetY是事件发生时,鼠 ...