Подтвердить что ты не робот

Метод Click() не всегда работает

У меня проблема с моими испытаниями в Selenium WebDriver. Событие Click не всегда работает, когда программа пытается щелкнуть по кнопке. В одном тесте все нормально, в других - нет.

Каждый тест начинается с одной страницы. Сначала пользователь должен выбрать параметр из компонента select, после чего пользователь нажимает кнопку.

Я хочу знать, почему один раз все в порядке, а когда я запускаю тесты во второй раз, это не так?

Вот исходный код поиска и нажатия кнопки:

public void clickContinueBtn() {    
    webElement = driver.findElement(By.xpath("//div[@class='btn magenta_s']/a/span"));
    webElement.click(); 
}
4b9b3361

Ответ 1

У меня возникла аналогичная проблема. Метод щелчка работал на других страницах, а затем не работал вообще на определенной странице.

Состояние гонки вызвало проблему:

  • Содержимое HTML отображается при отключенной кнопке.
  • Веб-драйвер selenium script был выполнен до запуска javascript onload (или завершено выполнение). Таким образом, button.click будет возникать в отключенном элементе. И ничего не произойдет.
  • Тогда событие onload javascript будет запускать (или закончить выполнение), и javascript включит кнопку.
  • Я просмотрел страницу и не смог понять, почему мой код не работал, потому что кнопка была включена при проверке, и если бы я вручную нажал кнопку, она сработала.

Как только я понял, что это проблема времени, я нашел решение здесь: Как я могу заставить Selenium Web Driver ждать, пока элемент будет доступен, а не просто присутствует?

Перефразировать решение в Ruby:

//This will not return the button until it is enabled.
button = driver.find_element(:xpath,  "//button[@id='myButtonId' and not(@disabled)]")
button.click

Ответ 2

Вы также можете попробовать использовать альтернативный метод Javascript для щелчка. Код для этого может быть следующим:

WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

Ответ 3

Уверены ли вы, что нет времени? Сделайте точку останова, прежде чем найти элемент, и посмотрите, работает ли ваш код. Если есть проблема с синхронизацией, используйте явный Wait перед нажатием кнопки. Также обратите внимание, что кнопка должна быть кликабельна (элемент должен быть видимым и включен), прежде чем на самом деле щелкнуть его.

решение с явным ожиданием может выглядеть так:

By by = By.xpath("//div[@class='btn magenta_s']/a/span");
WebDriverWait w = new WebDriverWait(driver, timeout);
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by);
element.click();

Ответ 4

У меня возникла аналогичная проблема пару дней назад, и я нашел решение в своем конкретном случае. === Используя Selenium Webdriver, я хотел нажать на ссылку "Первая ссылка" и загрузить контент на странице.

Ниже часть кода со структурой, подобной моему случаю:

<li class="first-link">
    <a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a>
</li>

=== В результате предполагается, что Webelement будет найден и нажат, но переключится на пользовательский интерфейс, ничего не произошло, ошибка не была выбрана (элемент не найден, элемент не готов к клику, отключен элемент и т.д.).

Попробовав пару способов найти ссылку (xpath и css, не пробовал по id, потому что в моем случае нет уникального идентификатора), я смог получить доступ и щелкнуть элемент с помощью selenium webdriver css с помощью следующее значение: li.first-link a. Однако, когда я попытался получить доступ к xpath со следующим значением, это было "найдено" в Firefox, но нажмите didnt work: .//li[a/text()='First Link'].

Проблема заключалась в незначительной проблеме синтаксиса xpath, что firebug от Firefox вообще не сообщал, на самом деле он нашел ссылку.

Я изменил порядок фигурных скобок следующим образом: .//li/a[text()='First Link'] Теперь он работает так, как ожидалось, первая ссылка найдена и нажата, а код javascript, загружающий страницу, запускается.

Мои выводы: * Это не проблема времени, поэтому этого не происходит, потому что вы пытаетесь щелкнуть элемент, который не готов. В противном случае мы решили это с явным ожиданием Селена...

  • Проблема заключается не в том, что элемент найден и javascript не запущен. Вы можете попробовать выполнить непосредственно код javascript и вручную запустить события и увидеть, что это не работает.
  • Эта проблема возникает в Firefox 22, вероятно, работает для более старых версий этого браузера. Я не могу предоставить информацию, если это работает в IE или Chrome. Сама проблема заключается в том, что даже при наличии конфликта синтаксиса в xpath firefox не генерируется исключение, что заставляет вас думать, что с вашим кодом нет ничего плохого, но есть.
  • Это неожиданное необработанное поведение для Firefox. Я нашел сообщение об ошибке: http://code.google.com/p/selenium/issues/detail?id=4757

РЕШЕНИЕ ПРЕДЛАГАЕМОЕ: проверьте структуру html, ваш xpath, попытайтесь найти проблемы в синтаксисе, найдите различные способы доступа к элементу.

Ответ 5

Глядя на ваш xpath, вы не определили кнопку, вместо этого вы указываете на тег span, внутри которого находится кнопка. Селин нажимает на диапазон вместо кнопки. Вот почему функция click() не работает. Пожалуйста, используйте Id или имя, если они доступны, или измените xpath, чтобы включить тег кнопки. Если вы можете опубликовать html, будет легко создать xpath. click() работает отлично для меня, и я использую этот метод более года в проекте и каждый раз, когда он отлично работает...

Ответ 6

Попробуйте ниже кода, иногда вы намеренно перемещаете фокус на свои элементы.

WebElement element = driver.findElement("yourElement");
        Actions builder = new Actions(driver);
        builder.moveToElement(element).click(element);
        builder.perform();

Ответ 7

Одной из возможных причин этого может быть метод click() не может отправлять событие click для каждого элемента.

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