如何使用Selenium提取并下载设置loading='lazy'属性的懒加载图片?
错误原因
- 新标签页上下文未切换:调用
window.open打开新标签页后,driver默认仍绑定原标签页,未切换到新打开的页面,在原页面查找目标元素自然会触发NoSuchElementException - WebDriverWait初始化顺序错误:代码中先调用
wait.until判断页面加载完成,之后才实例化wait对象,会先触发空指针异常,影响后续代码执行 - 等待条件逻辑错误:原有代码最后一行设置的是等待目标元素不可见,后续再查找元素必然无法找到
- 页面滚动后未预留渲染时间:执行滚动到底部的JS后,页面懒加载的元素需要渲染时间,没有等待直接查找元素也可能触发找不到的错误
修复后可运行代码
// 先初始化WebDriverWait,顺序不能乱 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); JavascriptExecutor js = (JavascriptExecutor) driver; // 打开新标签页 ((JavascriptExecutor)driver).executeScript("window.open('https://www.lambdatest.com/selenium-automation/','_blank');"); // 获取所有标签页句柄,切换到新打开的第二个标签页 ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles()); driver.switchTo().window(tabs.get(1)); // 等待页面加载完成 wait.until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); // 滚动到页面底部 js.executeScript("window.scrollTo(0, document.body.scrollHeight)"); // 等待目标img元素可见后再查找 By Image=By.xpath("//img[@title='Jenkins']"); WebElement ImageElemnt = wait.until(ExpectedConditions.visibilityOfElementLocated(Image)); // 提取src属性 String src = ImageElemnt.getAttribute("src"); System.out.println(src); // 如果后续不需要操作新标签页可以关闭切回原标签页 // driver.close(); // driver.switchTo().window(tabs.get(0));
额外注意事项
- 如果目标元素不是
<img>标签而是内嵌的<svg>标签,需要调整xpath定位规则,直接定位<svg>节点后提取对应属性即可 - 如果元素在iframe内,需要先切换到对应iframe上下文再查找元素
内容的提问来源于stack exchange,提问作者samrac
相关产品推荐
相关产品推荐

