硒在最近的发展中被广泛应用,因为它以前没有被使用过,并且已经走了太多的坑。这是一张唱片。

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版本)的更多相关文章

  1. Selenium二次封装-Java版本

    package com.yanfuchang.selenium.utils; import java.awt.AWTException; import java.awt.Robot; import j ...

  2. selenium 使用教程详解-java版本

    第一章 Selenium 概述 1.1.Selenium 发展史 ​ Selenium是一系列基于Web的自动化工具,提供一套测试函数,用于支持Web自动化测试.函数非常灵活,能够完成界面元素定位.窗 ...

  3. Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结

    Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结 1. 注册表是树形数据库 1 2. 注册表的由来 1 3. Java  操作注册表 2 3.1. 使用Preferences  ...

  4. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  5. 你的程序支持复杂的时间调度嘛?如约而来的 java 版本

    你的程序支持复杂的时间调度嘛? 这篇文章介绍了时间适配器的c#版本,是给客户端用的,服务器自然也要有一套对应的做法,java版本的 [年][月][日][星期][时间] [*][*][*][*][*] ...

  6. 崔用志-微信开发-java版本

    崔用志-微信开发-java版本 今天看到一些关于微信开发的知识蛮好的博客,分享给大家,希望对大家有帮助. 微信开发准备(一)--Maven仓库管理新建WEB项目 微信开发准备(二)--springmv ...

  7. java版本区别

    java版本区别 点我,点我,Eclipse几个版本号的区别(part1) 点我,点我,Eclipse几个版本号的区别(part2) 点我,点我,Eclipse几个版本号的区别(part3)

  8. javac。java版本切换

    如果安装有多个Java版本时(有时候有些软件自行安装),怎样方便的进行切换呢.除了常见的设置环境变量外,今天学到了一种新的切换方法: update-alternatives --config java ...

  9. JGibbLDA:java版本的LDA(Latent Dirichlet Allocation)实现、修改及使用

    转载自:http://blog.csdn.net/memray/article/details/16810763   一.概述 JGibbLDA是一个java版本的LDA(Latent Dirichl ...

  10. Mac下修改默认的Java版本

    今天在安装Elicpse IDE的时候,发现提示安装的Java版本不支持,于是在官方去下载了Jre最新版本并安装,在安装完过后再次打开Elicpse发现提示还是不正确,如果用Google查询到一些资料 ...

随机推荐

  1. Nanui 教程

    彩票自动投注软件定制-联灬系-\加/Q;2943075966 黑/科/技问/世.详情直接添加咨询.信/誉/文本 最近接到一个项目 是关于构建一套 电脑端会员管理系统    但考虑到个人比较喜欢写Web ...

  2. python做数据分析pandas库介绍之DataFrame基本操作

    怎样删除list中空字符? 最简单的方法:new_list = [ x for x in li if x != '' ] 这一部分主要学习pandas中基于前面两种数据结构的基本操作. 设有DataF ...

  3. Poetry

    1. Absence to love is what wind is to fire. It extinguishes the small; It inflames the great. 2. It ...

  4. Python 常用的内置函数

    1. str.isdigit( ) 作用:检测字符串是否有数字组成 2. strip( ) 作用:除去首尾指定的字符,包括空格,换行符,不能除去中间的字符 3. slice( ) 作用:以指定参数切割 ...

  5. [Ynoi2016]这是我自己的发明(莫队)

    话说这道题数据是不是都是链啊,我不手动扩栈就全 \(RE\)... 不过 \(A\) 了这题还是很爽的,通过昨晚到今天早上的奋斗,终于肝出了这题 其实楼上说的也差不多了,就是把区间拆掉然后莫队瞎搞 弱 ...

  6. css3中那些鲜为人知但又很有用的属性

    概述 这是我在写移动端页面的时候遇到的,css3中鲜为人知但又很有用的属性,记录下来,供以后开发时参考,相信对其他人也有用. tap-highlight-color 在移动端开发中,我们需要在用户轻按 ...

  7. OC中双向链表的实现

    双向链表的概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都 ...

  8. Swift 里 Array (二)初始化

    init() 函数 在 Array 里 public init() { _buffer = _Buffer() } 以Buffer 是 _ContiguousArrayBuffer 为例. 即初始化了 ...

  9. D15——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D15 20180926内容纲要: 1.CSS介绍 2.CSS的四种引入方式 3.CSS选择器 4.CSS常用属性 5.小结 6.练习 1 CSS介绍 层叠样式表 ...

  10. python的datetime常用方法

    把datetime转成字符串 datetime.strftime("%Y-%m-%d-%H") 把字符串转成datetime datetime.strptime(datetime, ...