You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium+Cucumber登录后无法点击元素,出现403错误求助

问题描述

我用Selenium和Cucumber编写了一个基础自动化测试用例,流程为登录酒店预订网站,登录后点击名为wifi checkbox的复选框。登录页面的用户名、密码输入及登录操作均可正常执行,但登录后Selenium无法点击wifi按钮,设置隐式等待也无效,还遇到了请求失败403错误。

完整测试代码

const {By, Key, Builder} = require("selenium-webdriver");
require("chromedriver");

const {Before,Given,When,And,Then}=require('@cucumber/cucumber')

let driver =  new Builder().forBrowser("chrome").build();

var {setDefaultTimeout} = require('@cucumber/cucumber');
setDefaultTimeout(60 * 1000);


Given('when you are on the login page', async function () {
  await driver.get("https://automationintesting.online/#/admin")
});

When('you enter login credentails' ,  function () {
  driver.findElement(By.id("username")).sendKeys("admin");
  driver.findElement(By.id("password")).sendKeys("password");
  driver.findElement(By.id("doLogin")).click();
});

When('your logged in ',{ implicit: 3000 },async ()=> {
  driver.manage().setTimeouts({ implicit: 3000 });
  await driver.findElement(By.id("wifiCheckbox")).click();
});

Then('you should be on the profile page', function () {
  driver.getCurrentUrl()
});

可正常运行的代码片段

driver.findElement(By.id("username")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("password");
driver.findElement(By.id("doLogin")).click();

运行失败的代码片段

driver.manage().setTimeouts({ implicit: 3000 });
await driver.findElement(By.id("wifiCheckbox")).click();

解决方案

问题根源

  1. 异步操作未等待:Selenium所有DOM操作均为异步,登录步骤未用await等待操作完成,导致页面还未跳转就执行后续元素定位,引发会话或元素加载问题。
  2. 隐式等待局限性:隐式等待是全局设置,无法精准等待目标元素的可交互状态,且3秒时长过短,不足以应对页面跳转后的元素加载延迟。
  3. 403错误原因:大概率是登录会话未完全建立就发起后续请求,服务器判定为未授权访问,拒绝请求。

修复步骤

  1. 统一使用async/await处理异步操作
    修改登录步骤,确保所有操作等待完成:

    When('you enter login credentails' ,  async function () {
      await driver.findElement(By.id("username")).sendKeys("admin");
      await driver.findElement(By.id("password")).sendKeys("password");
      await driver.findElement(By.id("doLogin")).click();
    });
    
  2. 替换隐式等待为显式等待
    导入until模块,精准等待目标元素出现并可点击,避免过早定位:

    // 在顶部补充导入
    const {By, Key, Builder, until} = require("selenium-webdriver");
    
    // 修改登录后的步骤
    When('your logged in ', async ()=> {
      // 最长等待10秒,直到元素被定位到且可点击
      const wifiCheckbox = await driver.wait(until.elementLocated(By.id("wifiCheckbox")), 10000);
      await driver.wait(until.elementIsEnabled(wifiCheckbox), 10000);
      await wifiCheckbox.click();
    });
    
  3. 验证登录状态
    在点击复选框前,先确认已成功登录并进入目标页面:

    Then('you should be on the admin page', async function () {
      await driver.wait(until.urlContains("/admin"), 10000);
    });
    
  4. 移除冲突的超时设置
    全局Cucumber超时已设为60秒,无需再单独设置3秒隐式等待,避免时效冲突。

关键说明

显式等待是Selenium处理动态元素的最佳实践,它会在指定时长内轮询检查元素状态,直到满足条件或超时,相比隐式等待更灵活精准。同时,所有异步操作必须用await等待,保证操作顺序符合测试流程。


内容的提问来源于stack exchange,提问作者Timothy Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:19:57