selenium element.click () не работает (не щелкает) - PullRequest
0 голосов
/ 09 мая 2019
String selector = ".rmcAlertDialog .buttons :first-child";
RemoteWebElement selection = (RemoteWebElement) driver.findElement(By.cssSelector(selector));
WebDriverWait wait = new WebDriverWait(driver, 60);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(selection));
if (element == selection) selection.click();

Но рассматриваемый элемент (кнопка) не отвечает на щелчок.

Если я нажимаю кнопку вручную, она работает, так что это не веб-страница по ошибке, а автоматизация.

Я проверил, есть ли кнопка, сравнив ее текстовое содержимое.

обновлено для уточнения

Этот код работает (или работал) для большинства кнопок.Код от интерпретатора сценария, который выполняет синтаксический анализ: -

select ".rmcAlertDialog .buttons :first-child" click

Этот код работал до более поздних версий chrome / selenium / chromedriver.

Код теперь не работаетдля некоторых кнопок.

selection.click() IS вызывается (проверено в отладчике), так как элемент всегда будет равен выбору, он просто не работает.

.buttons - имя класса контейнера div для кнопки (ей)

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Селектор не указывает на элемент с классом кнопки. У вас есть пробел между .button и :first-child в селекторе. Уберите пробел. Данный селектор ищет дочерний элемент тега с классом кнопки. Но я предполагаю, что вы пытаетесь щелкнуть первый элемент с классом кнопки, а не дочерним узлом элемента класса кнопки. Используйте это:

String selector = ".rmcAlertDialog .buttons:first-child";
1 голос
/ 09 мая 2019

Я думаю, что главная причина его неудачи в том, что ваше if утверждение никогда не будет верным.Я никогда не проводил подобных сравнений, но вы можете значительно упростить свой код и получить желаемый эффект.

Несколько предложений:

  1. Не определяйте локаторыкак String с, определите их как By с.Класс By определен именно для такой задачи и облегчает использование и передачу их вокруг НАМНОГО.

    String selector = ".rmcAlertDialog .buttons:first-child";
    

    превратится в

    By locator = By.cssSelector(".rmcAlertDialog .buttons:first-child");
    

    Обратите внимание на исправление, на которое указал Ахмедв своем ответе.

  2. Вам не нужно искать элемент, чтобы дождаться его нажатия.Существует перегрузка, которая принимает локатор By, используйте ее вместо этого.

    RemoteWebElement selection = (RemoteWebElement) driver.findElement(By.cssSelector(selector));
    WebDriverWait wait = new WebDriverWait(driver, 60);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(selection));
    

    становится

    WebElement element = new WebDriverWait(driver, 60).until(ExpectedConditions.elementToBeClickable(locator));
    
  3. Пропустить RemoteWebElement и WebElementсравнение.Я не думаю, что это сработает, и в этом нет необходимости.Ваш локатор будет последовательно находить один и тот же элемент.

Таким образом, ваш окончательный код должен выглядеть примерно так:

By locator = By.cssSelector(".rmcAlertDialog .buttons:first-child");
new WebDriverWait(driver, 60).until(ExpectedConditions.elementToBeClickable(locator)).click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...