美文网首页
特殊元素定位和操作(三)

特殊元素定位和操作(三)

作者: testerPM | 来源:发表于2020-01-19 21:33 被阅读0次
       --------------------------------懒加载----------------------------------

案例:
懒加载
https://sj.qq.com/myapp/category.htm?orgame=1

针对元素比较快消失,调式的方法:
1 . 调整网速,chrome打开F12选择network---->slow 3G

  1. 暂停浏览器渲染,chrome打开F12选择source,点击右边的暂停按钮(或F8)

        openBrowser("chrome");
        driver.get("https://sj.qq.com/myapp/category.htm?orgame=1");
        Thread.sleep(2000);
        //1.找到 正在加载 ...的元素
       WebElement element = driver.findElement(By.xpath("//div[@class=\"loading\"]"));
              //2. 滚动到 正在加载..的位置
       JavascriptExecutor jse = (JavascriptExecutor) driver;
       jse.executeScript("arguments[0].scrollIntoView()", element);

------------------------------------------------循环滑动---------------------------

循环滚动的目的:判断元素是否加载出来

-----------------------------判断元素是否加载出来--------------------------



                 openBrowser("chrome");
        driver.get("https://sj.qq.com/myapp/category.htm?orgame=1");
        Thread.sleep(2000);
        // 1.找到 正在加载 ...的元素
        WebElement element = driver.findElement(By.xpath("//div[@class=\"loading\"]"));
        // 2. 滚动到 正在加载..的位置
        //2.1 创建js的可执行对象
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        //3.循环滚动---用来判断定位的元素是否加载出来
        int num=1;
        while(true) {
            System.out.println("第"+num+"次滚动");
            num++;
            // 2.2 滚动到 正在加载....的元素位置
            jse.executeScript("arguments[0].scrollIntoView()", element);
            //2.3 如果当前页面不包含某个元素,说明元素即加载出来
            if(driver.getPageSource().contains("手机淘宝")) {
                driver.findElement(By.xpath("//a[text()=\"手机淘宝\"]")).click();
                break;//找到元素就跳出循环,如果不跳出,就会一直循环,点击 手机淘宝
                
            }
        }
        
        


问题: 上面的代码是否会存在死循环的情况?
答:会。比如
if(driver.getPageSource().contains("手机淘宝"))这个条件如果一直都没有成立,那么while(true)就会一直循环下去,就算页面加载完全,滚动到最底部了,代码依然还会一直循环执行

-----------------------------------针对上面可能存在的死循环问题进行优化----------------

思考:如何判断是否滑动到了最底部
通过判断滚动到最底部,还是找不到元素就跳出循环体

(1)根据 页面滚动到最底部 文字提示 ---去搜索更多


openBrowser("chrome");
        driver.get("https://sj.qq.com/myapp/category.htm?orgame=1");
        Thread.sleep(2000);
        // 1.找到 正在加载 ...的元素
        WebElement element = driver.findElement(By.xpath("//div[@class=\"loading\"]"));
        // 2. 滚动到 正在加载..的位置
        // 2.1 创建js的可执行对象
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        // 3.循环滚动---用来判断定位的元素是否加载出来
        int num = 1;
        while (true) {
            System.out.println("第" + num + "次滚动");
            num++;
            // 2.2 滚动到 正在加载....的元素位置
            jse.executeScript("arguments[0].scrollIntoView()", element);
            // 2.3 如果当前页面不包含某个元素,说明元素即加载出来
            if (driver.getPageSource().contains("手机淘宝88")) {
                driver.findElement(By.xpath("//a[text()=\"手机淘宝\"]")).click();
                break;// 找到元素就跳出循环,如果不跳出,就会一直循环,点击 手机淘宝

            }
            // 当页面加载完成,还是找不到元素,就跳出循环
            if (driver.getPageSource().contains("去搜索更多")) {
                System.out.println("滚动到了最底部");
                break;
            }

        }



(2) 根据 滚动前和滚动后的pageSource是否发生变化来判断是否滚动到了最底部
当第一次滚动到了最底部,代码会继续执行,当继续滚动时,此时页面就不会发生变化了,所以滚动前和滚动后页面是一样的,这样就可以跳出循环体


openBrowser("chrome");
        driver.get("https://sj.qq.com/myapp/category.htm?orgame=1");
        Thread.sleep(2000);
        // 1.找到 正在加载 ...的元素
        WebElement element = driver.findElement(By.xpath("//div[@class=\"loading\"]"));
        // 2. 滚动到 正在加载..的位置
        // 2.1 创建js的可执行对象
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        // 3.循环滚动---用来判断定位的元素是否加载出来
        String beforePageSource = "";
        String afterPageSource = "";
        int num = 1;
        while (true) {
            // 滚动前的PageSource
            beforePageSource = driver.getPageSource();
            System.out.println("第" + num + "次滚动");
            num++;
            // 2.2 滚动到 正在加载....的元素位置
            jse.executeScript("arguments[0].scrollIntoView()", element);
            // 滚动后的PageSource
            afterPageSource = driver.getPageSource();
            // 2.3 如果当前页面不包含某个元素,说明元素即加载出来
            if (driver.getPageSource().contains("手机淘宝88")) {
                driver.findElement(By.xpath("//a[text()=\"手机淘宝\"]")).click();
                break;// 找到元素就跳出循环,如果不跳出,就会一直循环,点击 手机淘宝

            }
            // 当页面加载完成,还是找不到元素,就跳出循环
            if (beforePageSource.equals(afterPageSource)) {
                System.out.println("滚动到了最底部");
                break;
            }

        }



问题:上述代码虽解决了死循环的问题,但是发现,页面中的有些元素是不需要滚动,就可以定位到的,这该怎么办呢?---当然进行滚动也可以定位,也是没有问题呢,但是我们还是希望代码可以进一步优化:



openBrowser("chrome");
        driver.get("https://sj.qq.com/myapp/category.htm?orgame=1");
        Thread.sleep(2000);
        // 1.找到 正在加载 ...的元素
        WebElement element = driver.findElement(By.xpath("//div[@class=\"loading\"]"));
        // 2. 滚动到 正在加载..的位置
        // 2.1 创建js的可执行对象
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        // 3.循环滚动---用来判断定位的元素是否加载出来
        String beforePageSource = "";
        String afterPageSource = "";
        int num = 1;
        while (true) {
            // 滚动前的PageSource
            beforePageSource = driver.getPageSource();
            // 当页面包含元素 --微信,即可定位
            if (driver.getPageSource().contains("微信")) {
                driver.findElement(By.xpath("//a[text()=\"微信\"]")).click();
                break;// 找到元素就跳出循环,如果不跳出,就会一直循环,点击 手机淘宝

            }
            // 2.2 滚动到 正在加载....的元素位置
            jse.executeScript("arguments[0].scrollIntoView()", element);
            System.out.println("第" + num + "次滚动");
            num++;
            // 滚动后的PageSource
            afterPageSource = driver.getPageSource();
            // 当页面加载完成,还是找不到元素,就跳出循环
            if (beforePageSource.equals(afterPageSource)) {
                System.out.println("滚动到了最底部");
                break;
            }

        }



上面的代码----while进入循环体,就找到了【 微信 】元素,无需滚动,当然如果找不到,就会执行下面的滚动的代码

相关文章

网友评论

      本文标题:特殊元素定位和操作(三)

      本文链接:https://www.haomeiwen.com/subject/agrdzctx.html