使用 selenium webdriver 无法单击网站的“登录”按钮

问题描述 投票:0回答:1

惠 以下是包含该登录按钮 id 的整个 div:

`<div class="row" id="signin-button-container">                         <button class="x2-button x2-blue" id="signin-button" style="border-color: #8d8d8d;;background: rgb(151, 151, 151); background: -moz-linear-gradient(top, #a1a1a1, #8d8d8d); background: -webkit-linear-gradient(top, #a1a1a1, #8d8d8d); background: -o-linear-gradient(top, #a1a1a1, #8d8d8d); background: -ms-linear-gradient(top, #a1a1a1, #8d8d8d); background: linear-gradient(top, #a1a1a1, #8d8d8d);">                             Sign in                        </button>                         <div class="clearfix"></div>                     </div> `

我已经尝试了所有选择器,包括以下内容:

        WebDriverWait wait3 = new WebDriverWait(driver, Duration.ofSeconds(3));
        WebElement signInButton;
        try {
            signInButton = wait.until(ExpectedConditions.elementToBeClickable(By.tagName("button")));
            System.out.println("Sign-in button successfully located.");
            signInButton.click();
        } catch (Exception e) {
            System.out.println("Failed to locate the sign-in button.");
            e.printStackTrace(); // Print exception details for debugging
            return null; // Return null to indicate failure
        }


我得到“成功找到登录按钮”的安慰。但按钮仍然没有被点击。 请指导。

java selenium-webdriver selenium-chromedriver
1个回答
0
投票

我假设您收到错误消息。您检查日志并收到一条消息“已成功找到登录按钮。”,然后是一条消息“无法找到登录按钮。”,然后是打印到日志中的实际异常消息。我假设错误消息是一个元素不可交互的异常。

为了使这项工作更好地发挥作用,需要解决许多问题,

  1. 尝试单击时不会收到任何错误,因为您捕获了所有异常

    catch (Exception e)
    

    更好的做法是仅捕获您期望的异常并且仅在您计划处理它们时才捕获。当您进行调试时,吃掉所有异常并打印通用消息并不是很有帮助……您现在正在经历这种情况。我会删除

    try-catch
    并让脚本在抛出时失败。在发生异常后继续执行脚本可能会导致其稍后失败,然后您将更难找出失败的原因。

  2. 您的定位器,

    By.tagName("button")
    ,是通用的。这将抓取页面上的every按钮,根据页面的不同,可能会有很多按钮。您发布的按钮的 HTML 有一个 ID...您应该始终使用它,
    By.id("signin-button")
    。您可能正在抓住 a 按钮,但按错了按钮,并且它不可见或以其他方式导致失败,这就是为什么您会收到成功消息,然后收到失败消息。

  3. 此消息“已成功找到登录按钮。”事实并非如此。它只是在等待没有超时时打印......这并不意味着它找到了正确的元素,我假设这就是这里发生的情况。

我的建议是将代码减少到下面,

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(By.id("signin-button"))).click();

如果代码引发异常,它将失败并打印到日志中,您将获得可以查看的完整异常消息。不要打印成功消息,它们不会增加任何价值。如果您的代码越过该行,您就知道它成功了。不要让自己或其他人费力地浏览数百行成功消息只是为了找到错误消息。它只是不必要地延长了调查时间。


其他杂项建议...

  1. 您在代码顶部定义了
    wait3
    ,但实际上并未使用它。下面三行您使用
    wait
    代替。
  2. 三秒真的很短。根据具体情况,我会至少执行 10 秒。如果该元素立即可用,则代码将不会等待,因此不会减慢代码速度。它真正减慢的唯一时间是元素永远不可用并且您指定了很长的等待时间,例如60年代。然后它将等待整整 60 秒才超时。您需要根据场景调整时间,但我的建议是对于大多数场景,10 秒是合适的等待时间。
© www.soinside.com 2019 - 2024. All rights reserved.