Selenium JS调用elementIsEnabled方法报错问题咨询
报错原因
两个报错均为Selenium WebDriver JavaScript版本API使用不规范导致,具体对应原因如下:
- 第一个报错
TypeError: Cannot read property 'elementIsEnabled' of undefined:until是selenium-webdriver独立导出的等待条件工具模块,并不挂载在driver实例对象上,代码中写driver.until时取到的值为undefined,后续调用elementIsEnabled方法自然会抛出类型错误。 - 第二个报错
ReferenceError: until is not defined:调整代码时直接使用了until变量,但顶部依赖导入语句中,仅从selenium-webdriver解构导入了Builder和By两个成员,没有导入until,当前代码作用域内不存在该变量,因此触发引用错误。
额外注意:即便正确导入until,直接把By定位器对象传给until.elementIsEnabled()也会运行异常,该方法要求传入的参数是已定位到的WebElement实例,而非定位选择器。
修复步骤
- 修正顶部依赖导入语句,补充导入
until模块:
const { expect } = require("chai"); // 补充解构导入until成员 const {Builder, By, until} = require("selenium-webdriver");
- 修正等待逻辑,先定位目标输入框元素再传入等待方法,移除错误的
driver.前缀调用,同时补充浏览器退出逻辑避免资源泄漏,完整修复后代码如下:
describe("Dynamic controls",function(){ it("Remove/add checkbox",async function(){ const driver = new Builder().forBrowser("firefox").build(); try { await driver.get("https://the-internet.herokuapp.com/dynamic_controls"); await driver.findElement(By.css("#input-example>button")).click(); // 先定位目标输入框元素 const targetInput = driver.findElement(By.css('#input-example > input[type=text]')); // 等待输入框变为可用状态 await driver.wait(until.elementIsEnabled(targetInput), 30000); await driver.findElement(By.css("#checkbox-example>button")).click(); } finally { // 用例执行完成后关闭浏览器实例 await driver.quit(); } }); });
内容的提问来源于stack exchange,提问作者Dmitry Maslo
相关产品推荐
相关产品推荐

