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

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

作者: 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