最近在使用 selenium 的时候,遇到了 element not interactable 的错误。引发错误的代码如下:
By orgOpt = By.xpath("//span[contains(text(),'XXX')]");
var p3 = driver.wait(until.elementLocated(orgOpt));
p3.then(function() {
driver.findElement(orgOpt).click();
});
错误信息如下:
Uncaught (in promise) ElementNotInteractableError: element not interactable
(Session info: chrome=78.0.3904.87)
at Object.throwDecodedError (second-app\node_modules\selenium-webdriver\lib\error.js:550:15)
at parseHttpResponse (second-app\node_modules\selenium-webdriver\lib\http.js:563:13)
at Executor.execute (second-app\node_modules\selenium-webdriver\lib\http.js:489:26)
at processTicksAndRejections (internal/process/task_queues.js:89:5)
at async thenableWebDriverProxy.execute (second-app\node_modules\selenium-webdriver\lib\webdriver.js:699:17)
后来发现,应该是尝试点击的时候元素还未可见。
解决办法就是在 until.elementLocated 之后再添加一个 until.elementIsVisible 的判断。
By orgOpt = By.xpath("//span[contains(text(),'XXX')]");
var p3 = driver.wait(until.elementLocated(orgOpt));
p3.then(function() {
var p4 = driver.wait(until.elementIsVisible(driver.findElement(orgOpt))); // 添加一个判断
p4.then(function() {
driver.findElement(orgOpt).click(); // 点击下拉选项选中机构
});
});
这样处理之后,就没有遇到 element not interactable 的错误了。