Почему Selenium иногда пропускает флажки? - PullRequest
0 голосов
/ 07 мая 2019

У меня проблемы с тем, что веб-драйверу иногда не удается установить флажки и просто их пропускать, как в Firefox, так и в Chrome.

Я пробовал разные решения, такие как

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

Здесь я предоставляю Javascript-код, который у меня есть для события click

...
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);
...

HTML-код, к которому он прикреплен, событие javascript click

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

данные кода Java используют данныеАтрибутом для доступа к элементу является вопрос.Также обратите внимание, что после нажатия на div в указанном ниже коде появляется «выбранный» класс (который является текущим состоянием).

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 голосов
/ 08 мая 2019

Я не знаю, почему это происходит, однако я знаю, как это можно решить. Вы можете реализовать 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");
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...