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实例化:

 1 //设置系统环境变量
 2 System.setProperty("webdriver.chrome.driver", env.getProperty("path.chrome.driver"));
 3 WebDriver webDriver = null;
 4 try{
 5     ChromeOptions options = new ChromeOptions();
 6     options.addArguments("--headless"); //无浏览器模式
 7     options.addExtensions(new File(env.getProperty("path.chrome.proxy")));//增加代理扩展
 8     webDriver = new ChromeDriver(options);//实例化
 9 }catch(Exception e){
10     e.printStackTrace();
11 }finally{
12     //使用完毕,关闭webDriver
13     if(webDriver != null){
14         webDriver.quit();
15     }
16 }

3.gecko项目使用

1.系统环境变量配置:webdriver.gecko.driver=DRIVER_PATH

2.常用options配置:

preference配置:

3.webdriver实例化:

 1 //设置系统环境变量
 2 System.setProperty("webdriver.gecko.driver", env.getProperty("path.gecko.driver"));
 3 WebDriver webDriver = null;
 4 try{
 5     FirefoxOptions options = new FirefoxOptions();
 6     options.addArguments("--headless"); //无浏览器模式
 7     FirefoxProfile profile = new FirefoxProfile();
 8     profile.addExtensions(new File(env.getProperty("path.chrome.proxy")));//增加代理扩展
 9     profile.setPreference("permissions.default.image", 2);//不显示图片
10     options.setProfile(profile);
11     //实例化
12     webDriver = new FirefoxDriver(options);
13 }catch(Exception e){
14     e.printStackTrace();
15 }finally{
16     //使用完毕,关闭webDriver
17     if(webDriver != null){
18         webDriver.quit();
19     }
20 }

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;
            });
三、获取内容
1 String page = driver.getPageSource();//获取网页全部信息
2 String url = driver.getCurrentUrl();//获取当前页url
3 WebElement element = driver.findElement(By.id("xx"));//获取元素
4 element.sendKeys("test");//设置元素值
5 element.click();//点击元素
6 element.sendKeys(Keys.BACK_SPACE);//空格键盘事件模拟
四、切换窗口、表单、弹窗:

1.窗口操作

 1 String handle = driver.getWindowHandle();//获取当前窗口句柄
 2 Set<String> handles = driver.getWindowHandles();//获取全部窗口句柄
 3 //切换到另一窗口
 4 for(String h : handles){
 5     if(!h.equals(handle)){
 6         driver.switchTo().window(h);//切换窗口
 7     }else{
 8         driver.close();
 9     }
10 }

2.表单操作,frame切换需要从外向内一层一层获取,可根据pageSource处理

3.弹窗操作

 

6. 代理使用

一、无auth验证代理
1 String proxyServer = "1.2.3.4:666";
2 Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);
3 options.setProxy(proxy);
二、需auth验证代理

使用browsermobproxy做代理(或其他代理)

 1 //创建一个本地代理
 2 BrowserMobProxyServer bmpServer = new BrowserMobProxyServer();
 3 bmpServer.setChainedProxy(new InetSocketAddress("proxy.com",222));//代理地址端口
 4 bmpServer.chainedProxyAuthorization("user","pwd",AuthType.BASIC);//代理用户名密码
 5 bmpServer.setTrustAllServers(true);//信任所有服务
 6 bmpServer.start(11112);//启动一个本地代理服务,并设置端口为11112,访问地址:localhost:11112
 7 //使用本地代理
 8 String proxyServer = "localhost:11112";
 9 Proxy proxy = new Proxy().setHttpProxy(proxyServer).setSslProxy(proxyServer);
10 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

1 BrowserMobProxy server = new BrowserMobProxyServer();
2 server.blacklistRequests("http://.*\\.blacklist.com/.*", 200);//方式1,设置单个黑名单
3 server.setBlacklist();//方式2,设置黑名单列表

2.通过拓展设置,暂时没整透

三、bmp代理无法连接

1.采用正确连接方式

7.分布式

使用grid启动多个节点

注意:单节点使用多线程时,最好使用geckodriver,chromium的js引擎是单线程执行的

posted @ 2018-12-15 15:19  工程师搁浅  阅读(917)  评论(0编辑  收藏  举报