对于这一段还蛮有感慨的,只想说,代码还是需要自己去敲的。

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提供了executeScriptexecuteAsyncScript两个方法来处理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 Java 高级应用的更多相关文章

  1. Selenium Webdriver java 积累一

    Selenium Webdriver 学习: http://jarvi.iteye.com/category/203994 https://github.com/easonhan007/webdriv ...

  2. [selenium webdriver Java]常用api

    1. 获取元素文本 WebElement类的getText()方法返回元素的innerText属性.所以元素里如果有子节点一样也会被返回出来.如下所示 public class GetText { @ ...

  3. [selenium webdriver Java]元素定位——findElement/findElements

    策略 语法 语法 描述 By id driver.findElement(By.id()) driver.findElements(By.id()) 通过id属性定位元素 By name driver ...

  4. [selenium webdriver Java]隐式的等待同步

    Selenium WebDriver提供了隐式等待来同步测试.当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,超出设定时间后,抛出找不到元素异常 即,当元素没 ...

  5. Selenium WebDriver java 简单实例

    开发环境 JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse: 下载地址:http ...

  6. Java 学习笔记 (二) Selenium WebDriver Java 弹出框

    下面这段实例实现了以下功能: 1. profile使用用户本地电脑上的 (selenium 3有问题.因为selenium 3把profile复制到一个temp文件夹里,但并不复制回去.所以每次打开仍 ...

  7. Selenium webdriver Java 操作IE浏览器

    V1.0版本:直接新建WebDriver使用 import org.openqa.selenium.WebDriver; import org.openqa.selenium.ie.InternetE ...

  8. Selenium webdriver Java firefox 路径设置问题

    问题: Cannot find firefox binary in PATH. Make sure firefox is installed. 原因:selenium找不到Firefox浏览器. 方法 ...

  9. Selenium webdriver Java 开始

    最早接触的selenium是 selenium IDE,当时是为了准备论文.为了用IDE还下载了Firefox浏览器.后来接触过两个项目都需要selenium,一个采用selenium webdirv ...

随机推荐

  1. java中final修饰符的使用

    1.final修饰符的用法: final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值. final可以修饰方法,被final修饰的方法不能被重写. final可以修饰类,被fi ...

  2. 十个技巧快速优化你的Laravel 5 程序

    性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论. 这里是简单的列表: 配 ...

  3. HDU 1556.Color the ball-差分数组-备忘

    备忘. 差分数组: 区间更新查询有很多方法,线段树.树状数组等都可以.如果为离线查询,就可以考虑使用差分数组. 假设对于区间[l,r]的每个数都加1,我们用一个数组a来记录,a[l]+=1;a[r+1 ...

  4. A - Enterprising Escape 【BFS+优先队列+map】

    The Enterprise is surrounded by Klingons! Find the escape route that has the quickest exit time, and ...

  5. ASP.NET Core 2.2 基础知识(三) 静态文件

    什么是静态文件? HTML,CSS,JS,图片等都叫做静态文件. 要想提供静态文件给客户端,需要注册静态文件中间件. 我们先分别添加一个 WebAPI 项目,一个 Razor 视图项目,比较两个项目的 ...

  6. ubuntu 下终端关于调试C++的命令

    先确定安装了vim 和gcc (c语言)或者g++(c++) 如果没有安装可以在终端输入以下命令: sudo apt-get install build-essential sudo apt-get ...

  7. Codeforces 785E Anton and Permutation(分块)

    [题目链接] http://codeforces.com/contest/785/problem/E [题目大意] 一个1到n顺序排列的数列,每次选择两个位置的数进行交换,求交换后的数列的逆序对数 [ ...

  8. Exercise02_03

    import java.util.Scanner; public class Mi { public static void main(String[] args){ Scanner input = ...

  9. ios-真机调试出错信息

    更新证书错误Code Sign error: Provisioning profile ‘XXXX'can't be found                   在Xcode中当你在更新了你得证书 ...

  10. Metesploit使用随笔

    平时在工作中真正用到metesploit机会不多,偶尔也会用来做漏洞验证,但是每次使用的时候都需要花点时间回忆一下具体是怎么用的,因此索性记下来方便自己,以使用Nessus扫描YS的某个硬件设备发现的 ...