Selenium TimeoutException求助:无法点击页面加载更多按钮
问题分析与解决方法
1. CDP版本不匹配警告
这个警告源于你的Chrome浏览器版本(115)与ChromeDriver版本(114)不兼容,Selenium依赖的Chrome DevTools Protocol(CDP)需要版本完全匹配才能正常工作。
- 解决:下载与你当前Chrome浏览器版本完全一致的ChromeDriver,替换现有驱动文件。
2. 加载更多按钮定位失败(TimeoutException)
Selenium在10秒内找不到可点击的目标按钮,常见原因及解决办法如下:
原因1:元素定位器错误
打开浏览器开发者工具(F12),找到页面底部的“加载更多”按钮,确认其data-test属性值是否为mms-search-srp-loadmore。如果实际属性值不同,修改代码中的CSS选择器。
原因2:按钮在页面底部,未滚动到可见区域
不可见元素无法被Selenium定位,需先滚动到按钮位置:
// 先等待元素存在 WebElement loadMoreButton = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("button[data-test='mms-search-srp-loadmore']"))); // 滚动到按钮可见 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", loadMoreButton); // 再等待按钮可点击并点击 wait.until(ExpectedConditions.elementToBeClickable(loadMoreButton)).click();
原因3:页面弹窗干扰
页面加载时可能出现Cookie同意弹窗,阻碍元素定位,需先处理弹窗:
try { WebElement acceptCookieBtn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button[data-test='mms-cookie-accept-all']"))); acceptCookieBtn.click(); } catch (TimeoutException ignored) { // 无弹窗则跳过 }
原因4:需循环点击直到加载完成
单点击一次仅加载部分数据,需循环点击直到按钮消失:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); while (true) { try { WebElement loadMoreButton = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("button[data-test='mms-search-srp-loadmore']"))); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", loadMoreButton); wait.until(ExpectedConditions.elementToBeClickable(loadMoreButton)).click(); // 等待新内容加载,可优化为等待列表元素数量增加 Thread.sleep(1500); } catch (TimeoutException e) { // 按钮消失,加载完成 break; } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } }
优化后的完整代码示例
System.setProperty("webdriver.chrome.driver", "path/to/matched/chromedriver"); ChromeDriverService service = new ChromeDriverService.Builder() .withLogOutput(System.out) .build(); WebDriver driver = new ChromeDriver(service); driver.get("https://www.mediamarkt.at/de/category/alle-notebooks-884.html"); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 处理Cookie弹窗 try { WebElement acceptCookieBtn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button[data-test='mms-cookie-accept-all']"))); acceptCookieBtn.click(); } catch (TimeoutException ignored) {} // 循环加载所有内容 while (true) { try { WebElement loadMoreButton = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("button[data-test='mms-search-srp-loadmore']"))); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", loadMoreButton); wait.until(ExpectedConditions.elementToBeClickable(loadMoreButton)).click(); Thread.sleep(1500); } catch (TimeoutException e) { System.out.println("所有内容加载完成"); break; } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } // 此处编写爬取数据的逻辑 // ... driver.quit();
内容的提问来源于stack exchange,提问作者b.tsolmonbat
相关产品推荐
相关产品推荐

