Selenium - 元素可点击但点击仍然失败

问题描述

这是我的代码

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。

解决方法

你需要试试javascript执行器点击

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

JavascriptExecutor js = (JavascriptExecutor)driver;

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

,

在您的第一个 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);
,

使用 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);
}
,

请尝试使用 js 单击而不是 Webdriver 单击,如下所示

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...