zoukankan      html  css  js  c++  java
  • 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引擎是单线程执行的

  • 相关阅读:
    Java学习:线程实现方式
    Java学习:异常的概念
    HDFS 其他命令---fsck
    Linux 常用命令
    Linux命令注释—HDFS运维
    大数据简介
    FusionInsight大数据开发---Oozie应用开发
    FusionInsight大数据开发---Flume应用开发
    FusionInsight大数据开发---Streaming应用开发
    FusionInsight大数据开发---Redis应用开发
  • 原文地址:https://www.cnblogs.com/aishangJava/p/10123466.html
Copyright © 2011-2022 走看看