Selenium2.41.0—获取动态资源 (转)

标签: selenium2 资源 | 发表时间:2014-06-20 15:41 | 作者:
出处:http://m635674608.iteye.com

一概述

    获取动态资源,可以使用HtmlUnit,但是其对JS的支持还是不够完善。相对与HtmlUnit还有一种驱动浏览器的下载还原工具Selenium。可以打开浏览器,获取网页,下载解析,支持dom,js,解析效果更好,但是打开浏览器速度方面有一定损失。个人实验,禁用CSS,图片下载,速度还尚可。

    Selenium也是自动化测试工具,支持驱动不同的浏览器,Firefox,IE,Chrome等,也包含HtmlUnit提供的驱动实现。

    本文描述Selenium驱动Firefox,请求响应,设置cookies,驱动JS等方法,用他登录某主流weibo还是不错的。

 

二 版本

 

Xml代码 复制代码  收藏代码
  1. <dependency>  
  2.      <groupId>org.seleniumhq.selenium </groupId>  
  3.      <artifactId>selenium-java </artifactId>  
  4.      <version>2.41.0 </version>  
  5. </dependency>  
<dependency>
	<groupId>org.seleniumhq.selenium</groupId>
	<artifactId>selenium-java</artifactId>
	<version>2.41.0</version>
</dependency>

 

三 典型应用

1)打开Google,搜索baidu

可以看到Firefox从打开,填写表单,到提交打开新页面过程。

 

Java代码 复制代码  收藏代码
  1. /** 
  2.  * 打开google搜索百度 
  3.  *  
  4.  * @param queryStr 
  5.  */  
  6. public  static  void demo() {  
  7.     String url = "http://www.google.com.hk";  
  8.   
  9.     WebDriver webDriver =  new FirefoxDriver();  
  10.     // 打开google  
  11.     webDriver.get(url);  
  12.   
  13.     // 使用Selenium的dom模型获取form  
  14.     WebElement webElement = webDriver.findElement(By.name("q"));  
  15.     webElement.sendKeys("baidu");  
  16.     webElement.submit();  
  17.   
  18.     // 通过判断 title 内容等待搜索页面加载完毕,Timeout 设置10秒  
  19.   
  20.     ( new WebDriverWait(webDriver, 100)).until( new ExpectedCondition<Boolean>() {  
  21.          public Boolean apply(WebDriver d) {  
  22.              return d.getTitle().toLowerCase().indexOf("baidu") != -1;  
  23.         }  
  24.     });  
  25.   
  26.     String responseBody = webDriver.getPageSource();  
  27.     System.out.println("Response : " + responseBody);  
  28.   
  29.     // 关闭浏览器  
  30.     webDriver.close();  
  31. }  
/**
 * 打开google搜索百度
 * 
 * @param queryStr
 */
public static void demo() {
	String url = "http://www.google.com.hk";

	WebDriver webDriver = new FirefoxDriver();
	// 打开google
	webDriver.get(url);

	// 使用Selenium的dom模型获取form
	WebElement webElement = webDriver.findElement(By.name("q"));
	webElement.sendKeys("baidu");
	webElement.submit();

	// 通过判断 title 内容等待搜索页面加载完毕,Timeout 设置10秒

	(new WebDriverWait(webDriver, 100)).until(new ExpectedCondition<Boolean>() {
		public Boolean apply(WebDriver d) {
			return d.getTitle().toLowerCase().indexOf("baidu") != -1;
		}
	});

	String responseBody = webDriver.getPageSource();
	System.out.println("Response : " + responseBody);

	// 关闭浏览器
	webDriver.close();
}

 

2)获取动态网页

与下面的请求响应一样,打开页面等待加载完毕即可,JS填充页面,AJAX都OK。

 

四 样例

1)请求响应

 

Java代码 复制代码  收藏代码
  1. public  static  void main(String[] args)  throws Exception {  
  2.     String url = "http://www.google.com";  
  3.     WebDriver webDriver =  new FirefoxDriver();  
  4.     // 打开google  
  5.     webDriver.get(url);  
  6.         String responseBody = webDriver.getPageSource();    
  7.         System.out.println("Response : " + responseBody);    
  8.     webDriver.quit();  
  9. }  
public static void main(String[] args) throws Exception {
	String url = "http://www.google.com";
	WebDriver webDriver = new FirefoxDriver();
	// 打开google
	webDriver.get(url);
        String responseBody = webDriver.getPageSource();  
        System.out.println("Response : " + responseBody);  
	webDriver.quit();
}

 

(2)配置不加载资源

 

Java代码 复制代码  收藏代码
  1. /** 
  2.  * 获得不加载 css,图片,flash的浏览器 
  3.  * @return 
  4.  */  
  5. public WebDriver getNoResouceWebDriver(){  
  6.     FirefoxProfile firefoxProfile =  new FirefoxProfile();  
  7.     // 去掉css  
  8.     firefoxProfile.setPreference("permissions.default.stylesheet", 2);  
  9.     // 去掉图片  
  10.     firefoxProfile.setPreference("permissions.default.image", 2);  
  11.     // 去掉flash  
  12.     firefoxProfile.setPreference("dom.ipc.plugins.enabled.libflashplayer.so",  false);  
  13.      return  new FirefoxDriver(firefoxProfile);  
  14. }  
/**
 * 获得不加载 css,图片,flash的浏览器
 * @return
 */
public WebDriver getNoResouceWebDriver(){
	FirefoxProfile firefoxProfile = new FirefoxProfile();
	// 去掉css
	firefoxProfile.setPreference("permissions.default.stylesheet", 2);
	// 去掉图片
	firefoxProfile.setPreference("permissions.default.image", 2);
	// 去掉flash
	firefoxProfile.setPreference("dom.ipc.plugins.enabled.libflashplayer.so", false);
	return new FirefoxDriver(firefoxProfile);
}

 

(3)配置Firefox路径

启动报找不到Firefox的时候可以使用:System.setProperty("webdriver.firefox.bin", firefoxPath)

 

(4)Cookies

1)设置Cookies

 

Java代码 复制代码  收藏代码
  1. public  void setCookies(WebDriver,webDriver,Map<String, String> cookies) {  
  2.      if (cookies !=  null && cookies.size() > 0) {  
  3.          for (Entry<String, String> c : cookies.entrySet()) {  
  4.             Cookie cookie =  new Cookie(c.getKey(), c.getValue());  
  5.             webDriver.manage().addCookie(cookie);  
  6.   
  7.             System.out.println("Set Cookies : " + c.getKey() + " | " + c.getValue());  
  8.         }  
  9.     }  
  10. }  
public void setCookies(WebDriver,webDriver,Map<String, String> cookies) {
	if (cookies != null && cookies.size() > 0) {
		for (Entry<String, String> c : cookies.entrySet()) {
			Cookie cookie = new Cookie(c.getKey(), c.getValue());
			webDriver.manage().addCookie(cookie);

			System.out.println("Set Cookies : " + c.getKey() + " | " + c.getValue());
		}
	}
}

 

2)获取响应Cookies

 

Java代码 复制代码  收藏代码
  1. public Map<String,String> getCookies(WebDriver webDriver){  
  2.     Set<Cookie> cookies = webDriver.manage().getCookies();  
  3.     Map<String, String> responseCookies =  new HashMap<String,String>();  
  4.      for (Cookie c : cookies) {  
  5.         responseCookies.put(c.getName(), c.getValue());  
  6.     }  
  7.       
  8.      return responseCookies;  
  9. }  
public Map<String,String> getCookies(WebDriver webDriver){
	Set<Cookie> cookies = webDriver.manage().getCookies();
	Map<String, String> responseCookies = new HashMap<String,String>();
	for (Cookie c : cookies) {
		responseCookies.put(c.getName(), c.getValue());
	}
	
	return responseCookies;
}

 

3)清理Cookies

 

Java代码 复制代码  收藏代码
  1. /** 
  2.  * 清除所有cookie 
  3.  */  
  4. public  void clearCookies(WebDriver webDriver) {  
  5.     webDriver.manage().deleteAllCookies();  
  6. }  
/**
 * 清除所有cookie
 */
public void clearCookies(WebDriver webDriver) {
	webDriver.manage().deleteAllCookies();
}

 

(5)驱动JS

Selenium 的Dom对不可见的Element(html有但是CSS属性为不显示等)找不到,这时候使用JS操作和提交是个不错的选择:

 

Java代码 复制代码  收藏代码
  1. public  void doWeb(WebDriver webDriver) {  
  2.     StringBuilder js =  new StringBuilder();  
  3.     js.append("document.getElementsByName('username')[1].value='").append(WeiboAccount.USERNAME)  
  4.             .append("';");  
  5.     js.append("document.getElementsByName('password')[1].value='").append(WeiboAccount.PASSWORD)  
  6.             .append("';");  
  7.     js.append("document.getElementsByClassName('W_btn_g')[1].click();");  
  8.     ((JavascriptExecutor) webDriver).executeScript(js.toString());  
  9.   
  10.     ( new WebDriverWait(webDriver, 100)).until( new ExpectedCondition<Boolean>() {  
  11.          public Boolean apply(WebDriver d) {  
  12.              return d.getTitle().indexOf("我的首页") != -1;  
  13.         }  
  14.     });  
  15. }  

 转载至: http://shihlei.iteye.com/blog/2067716



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [selenium2 资源] 推荐:

Google+资源手册

- 向往自由的风 - FeedzShare
发布时间:2011年08月02日,  已有 2 人推荐. Google在社交网络上的大动作已经足以引起Twitter和Facebook的危机感. 它以迅雷不及掩耳之势在短短16天内就俘获了1000万用户,而Twitter当时达到这个用户数用了780天,Facebook则长达852天. 不过和大部分新兴的在线服务一样,人们可能在注册了一个账户之后就几乎不管它了.

iOS开发资源

- - Starming星光社最新更新
iOS App UI 欣赏、分享精美的App界面设计. iOS代码实例搜索、iOS特效示例、iOS代码例子下载. 以web的形式提供iOS UI设计的素材,你可以在web上拖动一些控件做出简单的ios 应用效果,并且生成一个URL,能分享给其他人. 一款 Photoshop 插件,由 UI Parade 推出的一款针对iOS UI 的设计工具,设计师动动鼠标即可制作精美的 iOS 应用原型.

公开课资源收集

- leplay - HelloAHU
在线观看:网易 | 新浪 | 搜狐 | 腾讯 | 奇艺 | 土豆 | 沪江英语. 下载: 人人影视 | Open Classes |  VeryCD | 六维空间(IPv6) . 哈佛大学:公正课 [网易][新浪][搜狐][奇艺]. 哈佛大学:幸福课 [网易][新浪]. 耶鲁大学:博弈论 [网易][新浪][搜狐][奇艺].

Office常用资源链接

- Weiye - ExcelFans
下面是我经常访问的一些站点以及对这些站点的简要介绍,他们都非常优秀,是我重要的学习资源. 国内优秀的Excel专业站点,有着海量的贴子、文章和应用资源,论坛上活跃着大量的MS MVP和Excel技术高手. 站点内容和活动丰富多彩,近几年出版的一系列Excel图书广受读者好评. 著名的Excel博客站点,有许多Excel技术、技巧和应用方面的文章及新鲜资讯,大多都是博主研究和使用Excel的成果,经常有许多Excel界的大师访问并留言或发表文章.

Kindle 书籍资源整理

- UchihaLively - Nooidea.com | 装傻充愣
接下来的半年这个世界变化的速度或许是你无法想像的:二月底,摩托罗拉会推出XOOM平板(Android 3.0). 接着四月是iPad 2,五月底Android平板大军压境 HTC、Samgsung、Acer、ASUS,然后是 HP TouchPad(夏天),或许秋天还有iPad3. 这才三月不过半,马上iPad 2就开卖了,没有太多惊喜.

免费vpn资源回顾

- shuangxi - iGFW
这些都是以前博客介绍过的免费VPN,. 我凭着记忆把能用的发出来一些,. 看看有多少VPN坚挺到了现在. 注册后安装其客户端,不过服务器域名nos.vpntool.info被DNS污染可以参考http://igfw.tk/archives/664修改hosts文件继续使用,速度较慢. 日本的免费VPN软件,需安装其客户端无需注册,详细教程看http://igfw.tk/archives/3246,速度不错.

JavaScript 学习资源推荐

- thanq - 岁月如歌
最近 reddit 有讨论:References for JavaScript Mastery. 去年 Rey Bango 博客上也有一篇文章:What to Read to Get Up to Speed in JavaScript. 下面是我的整理,希望能对你有所帮助. DOM Scripting: Web Design with JavaScript and the Document Object Model – 2005 年,这本书的第一版是我最喜爱的前端书籍之一.

自学资源推荐

- mechelle.04 - 博客园-首页原创精华区
阅读: 878 评论: 14 作者: xiaotie 发表于 2010-04-23 23:24 原文链接. 群策群力,靠自学的兄弟们(性别歧视. )都推荐些自己的自学方法和自学资源. 我上大学时学习态度很差,是非常极品的那种. 有一门专业课,小班课,三十多人上. 这门课我几乎没有旷过课,但是呢,我也从没听过讲,都是带本小说或其它书去上课,然后看自己的.

Open API的资源集

- Rossoneri - 博客园-首页原创精华区
现在经常听到和使用到各种开放API,因此笔者对这些进行概要的汇总和整理,希望对有这些需求的有一定的参考价值. 什么是开放平台(Open Platform). 在互联网时代,把网站的服务封装成一系列计算机易识别的数据接口开放出去,供第三方开发者使用,这种行为就叫做Open API,提供开放API的平台本身就被称为开放平台.