JavaScript Selenium-Webdriver滚动问题:元素点击被拦截
问题:遍历品牌时出现ElementClickInterceptedError错误
我在页面中尝试遍历每个品牌,但操作5-7个品牌后脚本无法继续,原因是需要滚动页面。报错信息如下:
ElementClickInterceptedError: element click intercepted: Element is not clickable at point (389, 539). Other element would receive the click: <span ...
我的代码如下:
let swd = require("selenium-webdriver"); let browser = new swd.Builder(); let tab = browser.setChromeOptions().forBrowser("chrome").build(); async function main() { await tab.get("https://www.ameublement.com/showroom"); // PAGE BRAND let brands = await tab.findElements( swd.By.css(".col-6.col-lg-12.card-img") ); for (let e of brands) { console.log('go to page of a brand') await e.click() tab.sleep(300); // GO BACK tab.navigate().back() // await tab.executeScript("arguments[0].scrollIntoView();", e); // tab.getElementByClassName(e).scrollIntoView(); }; }
我尝试过以下两种方法:
- 执行滚动脚本(未生效):
// await tab.executeScript("arguments[0].scrollIntoView();", e);
- 调用scrollIntoView,但抛出错误:
// tab.getElementByClassName(e).scrollIntoView()
TypeError: tab.getElementByClassName is not a function
解决办法
修复滚动逻辑与异步操作:
你之前的executeScript滚动方法是正确的,但需要调整执行时机并补全异步操作的await。修改后的循环代码如下:for (let e of brands) { console.log('go to page of a brand') // 先将元素滚动到可视区域中心 await tab.executeScript("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", e); // 等待元素可点击 await tab.wait(swd.until.elementIsVisible(e), 2000); await e.click(); await tab.sleep(300); // 等待页面返回完成 await tab.navigate().back(); // 返回后等待品牌列表重新加载完成 await tab.wait(swd.until.elementsLocated(swd.By.css(".col-6.col-lg-12.card-img")), 3000); };错误原因说明:
tab.getElementByClassName不是Selenium JavaScript的合法API,直接使用已有元素对象e配合executeScript滚动即可。ElementClickInterceptedError是因为元素不在可视区域,被页面其他元素遮挡,必须先滚动到可见位置再点击。- 未加
await的异步操作(如tab.sleep、tab.navigate().back())会导致脚本执行顺序混乱,引发元素状态异常。
内容的提问来源于stack exchange,提问作者GrowyTobe
相关产品推荐
相关产品推荐

