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查询到一些资料 ...
随机推荐
- 【转】selenium webdriver三种等待方法
原文:https://www.cnblogs.com/lgh344902118/p/6015593.html webdriver三种等待方法 1.使用WebDriverWait from seleni ...
- gunicorn运行显示connection in use解决办法
运行gunicorn后显示如下错误: root@iZ2ze2gihbn4ot85zlcdxdZ:~/myproject# gunicorn -w 4 -b 0.0.0.0:5000 myapp:app ...
- linux安装mysql详细步骤
最近买了个腾讯云服务器,搭建环境. 该笔记用于系统上未装过mysql的干净系统第一次安装mysql.自己指定安装目录,指定数据文件目录. linux系统版本: CentOS 7.3 64位 安装源文件 ...
- 关于 kali linux
2.更新系统:首先更换一个速度快点的国内源(1) lsb_release -a先看你的版本,是Rolling还是其他什么(2) leafpad /etc/apt/sources.list(源的默认文件 ...
- dubbo实现原理之动态编译
Dubbo为了实现基于spi思想的扩展特性,特别是能够灵活添加额外功能,对于扩展或则策略选择的设配类能够动态生成.对于一些需求已知的类如Protocal,它们的设配类代码dubbo可以直接的提供,但是 ...
- 爬虫:Scrapy5 - 选择器Selectors
当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors), ...
- centos7上编译安装mysql5.6
注意,在做实验室统一关闭防火墙做的,在生产环境需要做防火墙规则的,大家要注意,做的时候尽量都是模仿生产环境的,比如服务一般都在/data/soft下面,尽量避免在/usr/local/下面. 安装编译 ...
- 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer
Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...
- MySQL笔记(5)---索引与算法
1.前言 本章记录MySQL中的索引机制,了解索引可以让数据库更快.索引太多会造成性能损耗,索引太少肯定查询效率不高. 2.InnoDB存储引擎所有概述 InnoDB中常见的索引有: B+树索引 全文 ...
- ES6快到碗里来---一个简单的爬虫指南
学习ES6的时候,没少看ES6入门,到现在也就明白了个大概(惭愧脸).这里不谈ES6,只谈怎么把ES6的页面爬下来放到一起成为一个离线文档. 之前居然没注意过作者把这本书开源了..瞎耽误功夫...地址 ...