为什么Selenium有时会跳过复选框?

时间:2019-05-07 15:56:16

标签: selenium-webdriver

在Firefox和Chrome浏览器中,webdriver有时无法单击复选框,而只是跳过它们,我遇到了麻烦。

我尝试了不同的解决方案,例如

click();
action.moveToElement(checkbox).clickAndHold(checkbox).release().perform();
jse.javascriptExecutor(argument[0].click(),checkbox).

在这里,我提供了单击事件所需的Javascript代码

...
var selectCorrectOption = function () {
        if ($(this).hasClass('selected')) {
            $(this).removeClass('selected');
            $(this).find('> input').prop('checked', false);
        } else {
            $(this).addClass('selected');
            $(this).find('> input').prop('checked', true);

        }
};

$('.option > .input-container').on('click', selectCorrectOption);
...

附加了javascript click事件的HTML代码

<div class="input-container selected" data-choice-id="2">
    <input type="radio">
</div>

Java代码数据使用数据属性来访问有问题的元素。还要注意,一旦单击div,下面的代码就会出现一个“ selected”类(当前状态)。

WebDriverWait wait = new WebDriverWait(driver, 20); 
JavascriptExecutor jse = (JavascriptExecutor)driver;
         wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("[data-choice-id='"+ wrongOptionVal +"']")));
               radio=wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("[data-choice-id='"+ wrongOptionVal +"']")));

jse.executeScript("arguments[0].scrollIntoView()", radio);
jse.executeScript("arguments[0].click()", radio);

我希望它是一致的,大多数情况下都可以,但是总是有一两次失败。

1 个答案:

答案 0 :(得分:0)

我不知道为什么会这样,但是我知道如何解决。您可以使用轮询机制来实现FluentWait,这将完成三件事:

  • 找到元素
  • 选择单选框,
  • 返回getAttribute("class").contains("selected")值。

如果getAttribute("class").contains("selected")将导致false,则该过程应重复。

    FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
            .pollingEvery(Duration.ofMillis(300))
            .withTimeout(Duration.ofSeconds(10));
    fluentWait.until(new Function<WebDriver, Boolean>() {
        @Override
        public Boolean apply(WebDriver driver) {
            WebElement element = driver.findElement(By.cssSelector(radioCssSelector));
            element.click();
            return element.getAttribute("class").contains("selected");
        }
    });