在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);
我希望它是一致的,大多数情况下都可以,但是总是有一两次失败。
答案 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");
}
});