Selenium使用总结(Java版本)
硒在最近的发展中被广泛应用,因为它以前没有被使用过,并且已经走了太多的坑。这是一张唱片。
1.环境配置
配置要点:
1.Web驱动程序应该与浏览器版本相对应,chrome使用chrome驱动程序和chrome浏览器,Firefox使用geckodrive和Firefox浏览器
2.支持headless:本地开发使用mac环境,默认支持;linux需要安装xvf8(虚拟GUI)
3.maven项目构建,使用selenium-3.9.1或者最新版本
4.linux配置参考:chrome:blog.csdn.net/qq_39802740… ; firefox:blog.csdn.net/u014283248/… www.xnathan.com/2017/12/04/…
2.chromium项目使用
chrome启动参数参考:peter.sh/experiments…
1.系统环境变量配置:webdriver.chrome.driver=DRIVER_PATH
2.常用options配置:

3.webdriver实例化:
//设置系统环境变量
System.setProperty("webdriver.chrome.driver", env.getProperty("path.chrome.driver"));
WebDriver webDriver = null;
try{
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless"); //无浏览器模式
options.addExtensions(new File(env.getProperty("path.chrome.proxy")));//增加代理扩展
webDriver = new ChromeDriver(options);//实例化
}catch(Exception e){
e.printStackTrace();
}finally{
//使用完毕,关闭webDriver
if(webDriver != null){
webDriver.quit();
}
}
3.gecko项目使用
1.系统环境变量配置:webdriver.gecko.driver=DRIVER_PATH
2.常用options配置:

preference配置:
3.webdriver实例化:
//设置系统环境变量
System.setProperty("webdriver.gecko.driver", env.getProperty("path.gecko.driver"));
WebDriver webDriver = null;
try{
FirefoxOptions options = new FirefoxOptions();
options.addArguments("--headless"); //无浏览器模式
FirefoxProfile profile = new FirefoxProfile();
profile.addExtensions(new File(env.getProperty("path.chrome.proxy")));//增加代理扩展
profile.setPreference("permissions.default.image", 2);//不显示图片
options.setProfile(profile);
//实例化
webDriver = new FirefoxDriver(options);
}catch(Exception e){
e.printStackTrace();
}finally{
//使用完毕,关闭webDriver
if(webDriver != null){
webDriver.quit();
}
}
4.注意:默认加载会屏蔽部分请求(js请求等)
4.Selenium项目使用基本操作
参考:www.cnblogs.com/linxinmeng/…
一、WebDriver实例化:见2、3
1.获取页面:driver.get(url);
2.关闭页面:driver.close(); 关闭进程:driver.quit();
二、加载等待:页面初始加载或元素加载时使用,三种方式:
1.线程强制休眠等待,Thread.sleep(3000);
2.隐式等待(全局等待),为所有操作设置等待时间,超时抛出异常;
3.可以为单个操作设置显式等待(可控等待,推荐使用)、等待触发事件和等待时间,可以自定义事件,可以随时间抛出异常
WebDriverWait wait = new WebDriverWait(webDriver, 60);//初始化等待60s
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("xx")));//等待xx元素出现
//自定义等待事件
WebElement frame = wait.until((ExpectedCondition<WebElement>) driver -> {
WebElement element = driver.findElement(By.id("iframepage"));
return element;
});
三、获取内容
String page = driver.getPageSource();//获取网页全部信息
String url = driver.getCurrentUrl();//获取当前页url
WebElement element = driver.findElement(By.id("xx"));//获取元素
element.sendKeys("test");//设置元素值
element.click();//点击元素
element.sendKeys(Keys.BACK_SPACE);//空格键盘事件模拟
四、切换窗口、表单、弹窗:
1.窗口操作
String handle = driver.getWindowHandle();//获取当前窗口句柄
Set<String> handles = driver.getWindowHandles();//获取全部窗口句柄
//切换到另一窗口
for(String h : handles){
if(!h.equals(handle)){
driver.switchTo().window(h);//切换窗口
}else{
driver.close();
}
}
2.表单操作,frame切换需要从外向内一层一层获取,可根据pageSource处理

3.弹窗操作

6. 代理使用
一、无auth验证代理
String proxyServer = "1.2.3.4:666";
Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);
options.setProxy(proxy);
二、需auth验证代理
使用browsermobproxy做代理(或其他代理)
//创建一个本地代理
BrowserMobProxyServer bmpServer = new BrowserMobProxyServer();
bmpServer.setChainedProxy(new InetSocketAddress("proxy.com",222));//代理地址端口
bmpServer.chainedProxyAuthorization("user","pwd",AuthType.BASIC);//代理用户名密码
bmpServer.setTrustAllServers(true);//信任所有服务
bmpServer.start(11112);//启动一个本地代理服务,并设置端口为11112,访问地址:localhost:11112
//使用本地代理
String proxyServer = "localhost:11112";
Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);
options.setProxy(proxy);
本地代理可单独做分布式部署,多节点,使用zk管理
三、使用浏览器扩展extensions
1.chrome扩展:无法在headless模式下使用加载扩展,尚未解决
chromeOptions.addExtensions(new File(env.getProperty("path.chrome.proxy")));//代理扩展 需要在background.js配置代理账号密码后再打包
6.遇到的坑
一、页面加载慢:(需验证)
chromium虽然是多进程执行,但是js引擎是单线程,同时打开多个窗口,只会加载一个页面,直到加载结束或打开下一个窗口才会去加载下一个页面,参考(blog.csdn.net/ouyanggengc…
firefox可以同时加载多个窗口的页面,同时会默认屏蔽一些请求
二、设置黑名单:屏蔽某些网页加载(设置header同理)
1.通过代理设置,browsermobserver
BrowserMobProxy server = new BrowserMobProxyServer();
server.blacklistRequests("http://.*\\.blacklist.com/.*", 200);//方式1,设置单个黑名单
server.setBlacklist();//方式2,设置黑名单列表
2.通过拓展设置,暂时没整透
三、bmp代理无法连接
1.采用正确连接方式

7.分布式
使用grid启动多个节点
注意:单节点使用多线程时,最好使用geckodriver,chromium的js引擎是单线程执行的
Selenium使用总结(Java版本)的更多相关文章
- Selenium二次封装-Java版本
package com.yanfuchang.selenium.utils; import java.awt.AWTException; import java.awt.Robot; import j ...
- selenium 使用教程详解-java版本
第一章 Selenium 概述 1.1.Selenium 发展史 Selenium是一系列基于Web的自动化工具,提供一套测试函数,用于支持Web自动化测试.函数非常灵活,能够完成界面元素定位.窗 ...
- Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结
Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结 1. 注册表是树形数据库 1 2. 注册表的由来 1 3. Java 操作注册表 2 3.1. 使用Preferences ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- 你的程序支持复杂的时间调度嘛?如约而来的 java 版本
你的程序支持复杂的时间调度嘛? 这篇文章介绍了时间适配器的c#版本,是给客户端用的,服务器自然也要有一套对应的做法,java版本的 [年][月][日][星期][时间] [*][*][*][*][*] ...
- 崔用志-微信开发-java版本
崔用志-微信开发-java版本 今天看到一些关于微信开发的知识蛮好的博客,分享给大家,希望对大家有帮助. 微信开发准备(一)--Maven仓库管理新建WEB项目 微信开发准备(二)--springmv ...
- java版本区别
java版本区别 点我,点我,Eclipse几个版本号的区别(part1) 点我,点我,Eclipse几个版本号的区别(part2) 点我,点我,Eclipse几个版本号的区别(part3)
- javac。java版本切换
如果安装有多个Java版本时(有时候有些软件自行安装),怎样方便的进行切换呢.除了常见的设置环境变量外,今天学到了一种新的切换方法: update-alternatives --config java ...
- JGibbLDA:java版本的LDA(Latent Dirichlet Allocation)实现、修改及使用
转载自:http://blog.csdn.net/memray/article/details/16810763 一.概述 JGibbLDA是一个java版本的LDA(Latent Dirichl ...
- Mac下修改默认的Java版本
今天在安装Elicpse IDE的时候,发现提示安装的Java版本不支持,于是在官方去下载了Jre最新版本并安装,在安装完过后再次打开Elicpse发现提示还是不正确,如果用Google查询到一些资料 ...
随机推荐
- WPF自定义控件开发实例 - ColorPicker
开发环境:Win10 + VS2017 + .Net4.5 这个 ColorPicker 是<<WPF编程宝典:使用C#2012和.NET4.5>>这本书中的例子.这里我记录一 ...
- win10 17025 触摸bug
This article is written in both English and Chinese. 本文使用中文和英文两个版本. 在 win10 的 17025 可以容易让 UWP 触摸失效.做 ...
- 【JavaScript】js 中一些需要注意的问题
关于js中逻辑运算符 sort()方法 1. 关于js中逻辑运算符:|| 和 && 在js逻辑运算中,0."".null.false.undefined.NaN都会 ...
- AJPFX平台讲述买卖、点差、单位,外汇的交易时间以及外汇交易者的参与者
AJPFX平台讲解:买(多).卖(空).点差.单位 外汇保交易也就是通过外汇的升值和贬值来赚取利润.以EURUSD(欧元/美元)为例.假设目前价格为1.3820左右,即1欧元兑换1.3820美元.这个 ...
- 关于错误 openssl/ssl.h:没有那个文件或目录的解决办法
原文链接:https://blog.csdn.net/kulala082/article/details/68484314 首先得安装openssl:sudo apt-get install open ...
- python-i春秋验证码识别
i春秋作家:hlpureboy python+机器学习+验证码识别+源码 简单介绍 最近在写某网站的自动注册,在注册的过程中遇到一些问题,如js的执行.验证码的识别等等,今天给大家如何用python通 ...
- Linux巩固记录(9) keepalived+nginx搭建高可用负载分发环境
环境准备(继续服用hadoop节点) slave1 192.168.2.201(CentOs 7) slave2 192.168.2.202(CentOs 7) slave1 和 slave2 上 ...
- jvm垃圾回收的过程
垃圾回收的过程分为两步: 1.判断对象是否死亡 (1)引用计数器法: ①每当有一个对象引用是,计数器加一,当计数器为0是对象死亡 ②缺点:无法解决循环引用的问题,假设A引用B,B引用A,那么这两个对象 ...
- Liferay开发实战(2):Service Builder生成持久化层,及开发服务层
本文Liferay适用版本:v6.2.ce-ga6版 Liferay的插件体系是:模型-视图-控制器的portlet MVC框架.MVC是一个伟大的用于Web应用程序的设计模式,在实际应用中还应处理持 ...
- iOS-button利用block封装按钮事件【runtime 关联】
用block封装最常用的就是网络请求的回调,其实也可以结合category封装button的按钮事件,同时利用runtime的对象关联: UIButton+wkjButton.h 文件 #import ...