--------------------------------懒加载----------------------------------
案例:
懒加载
https://sj.qq.com/myapp/category.htm?orgame=1
针对元素比较快消失,调式的方法:
1 . 调整网速,chrome打开F12选择network---->slow 3G
- 暂停浏览器渲染,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进入循环体,就找到了【 微信 】元素,无需滚动,当然如果找不到,就会执行下面的滚动的代码
网友评论