【问题标题】:Selenium - element is clickable but click still failsSelenium - 元素是可点击的,但点击仍然失败
【发布时间】:2021-04-07 02:56:44
【问题描述】:

这是我的代码

do {
    try {
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath(xpLand)));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        driver.findElement(By.xpath(xpLand)).click();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Thread.sleep(500);
    if (i > 20 ) {
        break;
    }
    i++;
} while (driver.findElements(By.xpath(xpLand)).size() > 0);

网址https://win.milwaukeetool.eu/#

elementToBeClickable 有效(我也尝试过不同版本的visible 和其他替代方案),没有抛出异常。 click 也可以,但点击不会触发任何内容。最后,while-条件也是true

发生的情况是页面加载(在上面的代码之外),可点击满足,点击不抛出异常,while-condition 大于 0(如果点击有效,则会加载新页面它会是 0),然后重新开始。

屏幕尺寸 1440 x 900-23(23 = 菜单栏高度) xpLand = //img [@src='/img/countries/se.svg']

奇怪的是,它大约有一半的时间可以工作,但另一半却失败了(我只运行了大约 400 次,它每次都工作并失败了大约 200 次)。如果我在代码卡住时手动单击链接,单击会导致预期结果。

就像有时卡住一样。我有一个外循环(上面看不到),它使用同一个驱动程序运行十次,然后启动一个新驱动程序。如果它“卡住”了,在这十个循环完成并启动新驱动程序之前,它将无法再次工作。然后它可能会工作 5-10 次,直到再次卡住。

使用 Chrome/chromedriver。

【问题讨论】:

  • 什么是xpLand

标签: java selenium selenium-webdriver webdriverwait expected-condition


【解决方案1】:

你需要尝试javascript执行器点击

WebElement 按钮 =driver.findElement(By.id("btn"));

JavascriptExecutor js = (JavascriptExecutor)驱动程序;

js.executeScript("arguments[0].click();", button);

【讨论】:

    【解决方案2】:

    在您的第一个try/catch{} 块中,一旦元素返回如下,而不是仅仅诱导WebDriverWait 调用click()

    do {
        try {
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath(xpLand))).click();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Thread.sleep(500);
        if (i > 20 ) {
            break;
        }
        i++;
    } while (driver.findElements(By.xpath(xpLand)).size() > 0);
    

    【讨论】:

      【解决方案3】:

      使用JavascriptExecutor 的“优雅”解决方案是这样的:

      WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(xpLand)));
      ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
      

      当使用JavascriptExecutor 时,有人可能会争辩说“它不是真正的用户交互”,
      这确实不是对用户交互的模拟,但在某些情况下,我们确实需要一个可靠的非片状解决方案来应对意外行为,而这正是这样做的。

      您还可以包装不同的点击功能,这样您就不必重复它们:

      public void click(WebElement element) {
          wait.until(ExpectedConditions.elementToBeClickable(element)).click();
      }
      
      public void clickJS(WebElement element) {
          WebElement element = wait.until(ExpectedConditions.elementToBeClickable(element));
          ((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
      }
      

      【讨论】:

        【解决方案4】:

        请尝试js点击而不是Webdriver点击如下

        JavascriptExecutor 执行器 = (JavascriptExecutor) 驱动程序; executor.executeScript("arguments[0].click();", xpLand);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-16
          • 1970-01-01
          • 2015-06-13
          • 1970-01-01
          • 2022-01-14
          • 2016-06-08
          • 2021-05-17
          • 1970-01-01
          相关资源
          最近更新 更多