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查询到一些资料 ...
随机推荐
- 剑指offer编程题Java实现——面试题7用两个栈实现队列
题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...
- SAP接口的调用
最近做一个专案用到的SAO接口的调用,用到的上传参数获取回传的IRfcTable,以及以IRfcTable作为参数上传SAP,通过查阅很多资料,发现资料说明的也多是鱼龙混杂,许多没有实现就直接贴在上面 ...
- 一些浩辰设置及它的bug?
gcad执行快捷键有问题?尝试修改Setvar("autocompletemode", "19");原因是’输入按键时显示建议列表’这个项打钩了,这里首先捕捉的 ...
- 安装fastdfs文件系统
1.下载源码包 需要下载的源码包: fastDFS源代码:FastDFS_v5.01.tar.gz fastDFS的nginx模块源代码:fastdfs-nginx-module_v1.15.tar. ...
- Liferay-Activiti 企业特性功能介绍 (新版Liferay7)
前言 如果你是开发者 你已经是多少次开发一个项目,一次次的用一些框架,一次次的写类似的重复的代码,一次次建表\写类和方法\写HTML\CSS\JAVASCRIPT,一次次测试,一次次的写Bug...如 ...
- 一步步Cobol 400上手自学入门教程04 - 过程部
过程部的作用:编写程序要执行的语句,是程序的核心. 结构: 基本语句 INITIALIZE 设置数据项的初始值 ACCEPT 接收从键盘或指定设备上获得输入数据. 例子: 当批处理文件读到调用ACCP ...
- 人工智能-机器学习之Selenium(chrome驱动,火狐驱动)
selenium是一个用于web应用程序测试的工具,Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla Suite等 ...
- Strom的trident单词计数代码
/** * 单词计数 */ public class LocalTridentCount { public static class MyBatchSpout implements IBatchSpo ...
- Nginx单向认证的安装配置
Nginx单向认证的安装配置 首先系统要已经安装了openssl,以下是使用openssl安装配置单向认证的执行步骤与脚本: #------------------------------------ ...
- [个人项目] echarts 实现数据(tooltip)自动轮播插件
前言 最近, 工作中要做类似这种的项目. 用到了百度的 echarts 这个开源的数据可视化的框架. 因为投屏项目不像PC端的WEB, 它不允许用户用鼠标键盘等交互. 有些图表只能看到各部分的占比情况 ...