Selenium+Axe测试遇(intermediate value).findElement is not a function错误,Cookie弹窗如何处理
报错根因
你当前的(intermediate value).findElement is not a function报错是逻辑写法错误导致的:findElement是WebDriver实例的原生方法,不属于AxeBuilder实例,你将点击逻辑写在了AxeBuilder的调用链上,自然找不到对应方法。如果要通过点击同意按钮处理弹窗,调整代码顺序即可,把点击逻辑放到Axe测试执行之前。
最优处理方案:Chrome启动阶段直接屏蔽Cookie弹窗
你要求的启动浏览器时就阻止弹窗的方案是该场景的最优解,不需要适配不同站点的同意按钮选择器,测试稳定性更高,不会因为前端迭代修改按钮属性导致用例失效。
通过给Chrome配置启动参数和用户偏好,直接从浏览器层面禁用Cookie同意提示,完整实现代码如下:
const AxeBuilder = require('@axe-core/webdriverjs'); const WebDriver = require('selenium-webdriver'); const {By} = require('selenium-webdriver'); const {Options} = require('selenium-webdriver/chrome'); // 配置Chrome启动参数 const chromeOptions = new Options(); // 禁用Cookie提示弹窗 chromeOptions.addArguments('--disable-cookie-controls'); chromeOptions.setUserPreferences({ 'profile.default_content_setting_values.cookies': 1, // 允许站点保存Cookie 'profile.managed_default_content_settings.cookie_notifications': 2 // 全局禁用Cookie通知 }); // 初始化driver时加载Chrome配置 const driver = new WebDriver.Builder() .forBrowser('chrome') .setChromeOptions(chromeOptions) .build(); driver.get('mysite').then( () => { // 无需额外处理弹窗,直接执行Axe测试 new AxeBuilder(driver) .analyze((err, results) => { if (err) { // 错误处理逻辑 } console.log(results.violations); }); });
可选方案:修复点击同意按钮的代码写法
如果部分站点自定义弹窗无法通过浏览器配置屏蔽,可以用修复后的点击逻辑处理:
const AxeBuilder = require('@axe-core/webdriverjs'); const WebDriver = require('selenium-webdriver'); const {By} = require('selenium-webdriver'); const driver = new WebDriver.Builder().forBrowser('chrome').build(); driver.get('mysite').then( async () => { // 先通过driver实例找到同意按钮点击 await driver.findElement(By.id('accept')).click(); // 点击完成后再执行Axe测试 new AxeBuilder(driver) .analyze((err, results) => { if (err) { // 错误处理逻辑 } console.log(results.violations); }); });
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

