手记

selenium 实际项目中遇到的问题

问题1 mac下Chrome浏览器无法最大化
解决方法:使用ChromeOptions类。ChromeOptions类是控制Chrome启动属性的类,主要可以提供一下功能:

  • 设置 chrome 二进制文件位置 (binary_location)
  • 添加启动参数 (add_argument)
  • 添加扩展应用 (add_extension, add_encoded_extension)
  • 添加实验性质的设置参数 (add_experimental_option)
  • 设置调试器地址 (debugger_address)
//解决编码
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--start-fullscreen");
WebDriver driver = new ChromeDriver(chromeOptions);

问题2 显示等待(Explicit Waits)和隐式等待(implicit Waits)的区别
1、显示等待
1)显示等待定义了等待条件,只有满足条件才能执行后续的代码。
2)常见
Thread.sleep() //使用这种方法比较笨
WebDriverWait+ExpectedCondition //比较灵活,expected_condition模块提供了一组预定义的方法

//invisibilityOfElementLocated直到定位元素消失
new WebDriverWait(driver,10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("whitebarrier")))
//until_not使用
new WebDriverWait(driver,10).until_not(ExpectedConditions.invisibilityOfElementLocated(By.id("whitebarrier")))

2、隐式等待
1)如果某些元素不是立即可用,隐式等待是告诉WebDriver等待一段时间在去查找元素。注意设置了隐式等待就是设置了WebDriver的整个生命周期。

driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);

3、其他
1)页面加载超时时间

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(60,TimeUnit.SECONDS);

问题3 需要多次下拉加载的更多数据的页面如何滑到到页面底部
思路:
1、需要知道关注用户的个数来得到需要下拉加载几次得到所有的数据。
2、使用for循环滑动页面(因为操作window.scrollTo语句,不会使页面自动加载下一页数据,必须重新执行一下window.scrollTo语句)

//获取当前登录用户的关注数
String number  = driver.findElement(By.cssSelector("span[ms-text='@UserData.fans']")).getText();
//每页加载20条数据,关注数除20等到需要加载的页数
for (int i=0;i<Math.ceil(Double.parseDouble(number)/20.00);i++){                 
        ((JavascriptExecutor)driver).executeScript("window.scrollTo(0,10000);");
         Thread.sleep(5000);
            }

其他
1)String转double类型:Double.parseDouble(String str)
2)String转int类型:Integer.valueOf(String str).intValue()
3)向上取整Math.ceil(double)
4)向下取整Math.floor(double)

问题4 页面上多个滚动条选择滑动
一些废话,一个老大难的问题终于解决了,自己对JS这一块不太了解导致一个其实比较简单的问题今天才把原理弄明白,window.scrollTo()作用的是整个window,如果要对某个标签对执行JS脚本,必须先定位该元素。

//用Id定位
((JavascriptExecutor)driver).executeScript("var test = document.getElementById('catalogListBOX');"+
            "test.scrollTo(0,50);");
var test = document.getElementById("id");
test.scrollTo(0,500);
//用ClassName定位,注意是Elements是有s的
((JavascriptExecutor)driver).executeScript("var test = document.getElementsByClassName('catalogListBOX')[0];"+
            "test.scrollTo(0,50);");

附上html测试代码

<!DOCTYPE html>
<html>
    <head>

        <meta charset="UTF-8">
        <title>滚动条</title>
    </head>

    <body>
        <input type="button" onclick="scrollWindow()" value="滚动" />
        <style>
            ul{
                overflow-y: scroll;
            }
            li{
                    list-style: none;
                    width: 100%;
                    height: 50px;
                    display: block;
                    background: pink;
                    border: 1px solid #3A3D40;
            }
        </style>
        <div   id = "catalogListBOX">
            <ul  class="catalogListBOX">
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
                <li>1</li>
            </ul>
        </div>

        <script type="text/javascript">
            function scrollWindow()
              {
                var test = document.getElementsByClassName("catalogListBOX");
                test.scrollTo(0,50);
                console.log(test);
              }
        </script>
    </body>
</html>
2人推荐
随时随地看视频
慕课网APP