Я попытался найти решение этой проблемы, и я потратил много времени, но мне почти невозможно это сделать.
Дело: я использую Selenium с Java в Firefox. Мне нужно найти элемент (список) и нажать на него. Таким образом, код находит элемент, но действие click не работает. Он отлично работает в Google Chrome каждый раз, и иногда иногда в Firefox (с тем же кодом Java иногда работает, а иногда и нет).
Существует часть кода с элементом, когда программа входит на страницу:
SELECCIONA TALLA
И есть часть кода, которая изменяется при щелчке элемента:
Я пробовал много решений, и иногда это работает, но в следующий раз, когда я запускаю программу, она не работает снова.
Некоторые решения:
-
Он находит элемент, но не запускает действие click. Я проверил с xpath и cssSelector, и есть уникальные элементы, найденные с этими выражениями.
driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")).click(); // Also checked with By.cssSelector("span.selected-size")
-
Я, хотя это было из-за времени, поэтому я попытался решить его таким образом.
WebElement we = driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")); // By.cssSelector("span.selected-size") Thread.sleep(3000); we.click();
-
Наконец, я был немного в отчаянии, и я создал новую функцию, чтобы попытаться сделать это почти 60 раз, ища изменения в коде элемента, и если бы произошли какие-либо изменения, просто попытался снова выполнить действие click.
clickAndWaitWhileElementIsNotPresent(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span"),By.xpath("//div[@class='size-btn opened']/span")); // By.cssSelector("span.selected-size") private void clickAndWaitWhileElementIsNotPresent(By by1, By by2) throws Exception { for (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (isElementPresent(by2)) { break; } else { driver.findElement(by1).click(); } } catch (Exception e) { } Thread.sleep(1000); } }
- clickAndWaitWhileElementIsNotPresent(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span"),By.xpath("//div[@class='size-btn opened']/span")); // By.cssSelector("span.selected-size") private void clickAndWaitWhileElementIsNotPresent(By by1, By by2) throws Exception { for (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (isElementPresent(by2)) { break; } else { driver.findElement(by1).click(); } } catch (Exception e) { } Thread.sleep(1000); } }
Есть изображения элемента:


Кто-нибудь знает, как это сделать?
- Selenium webdriver Java-код с помощью веб-драйвера для двойного щелчка по записи в сетке
- Не удалось найти элемент с использованием ошибки xpath в selenium-java
- Как вводить символы один за другим в текстовое поле в selenium webdriver?
- Получение Selenium для паузы в течение X секунд
- WebDriver против ChromeDriver
Наконец, я нашел ответ, который работает как с Firefox, так и с Google Chrome.
WebElement we = this.driver.findElement(By.id("size-btn")); JavascriptExecutor executor = (JavascriptExecutor) driver; executor.executeScript("arguments[0].click();", we); waitForElementPresent(By.xpath("//div[@id='size-btn' and contains(@class,'opened')]/span"));
Спасибо, что прочитал меня.
Я не уверен, почему вы используете этот Xpath, если у вас есть свобода менять Xpath, тогда запишите элемент с помощью Xpath::position
IDE и используйте Xpath::position
из выпадающего списка target
(он выбирает уникальный путь относительно html-заголовка), он будет решить проблему динамического локатора. И попробуйте указанные ниже события.
1- Используйте clickAt
.
2- Используйте fireevent(focus)
а затем нажмите. Иногда бывает, что какой-то элемент в заднем поле загружается, когда он загружается, фокус перемещается туда, следовательно, ошибка elementNotVisible.
3- Используйте mouseDownRight
.
У меня такая же проблема в Firefox. Хитрость заключается в том, чтобы щелкнуть текст внутри самой кнопки.
У меня есть какое-то решение, сделайте class с роботом, там введите ключи события TAB, затем вызовите этот class. Что он делает, как назад, чтобы сосредоточиться на странице. Для некоторых razon страница потеряла фокус и никогда не обнаружила этого botton.
Robot robot; try { robot = new Robot(); robot.keyPress(KeyEvent.VK_TAB); robot.keyRelease(KeyEvent.VK_TAB); } catch (AWTException e) {e.printStackTrace();}
Вы можете попробовать использовать class Actions из org.openqa.selenium.interactions:
WebElement element = driver.findElement(By.id("size-btn")); Actions builder = new Actions(driver); builder.moveToElement(element).click(element); builder.perform();
- Переключение между вкладками браузера с помощью Selenium WebDriver с Java
- Как использовать другую версию IE (IE6, 7, 8, 9 и 10) в Selenium WebDriver с Java
- Selenium Webdriver: элемент незавидного исключения
- Метод sendKeys (CharSequence ) в типе WebElement не применим для аргументов (String)
- Обработка всплывающего windows с использованием seleniumа
- Как прокрутить определенный DIV, используя Selenium WebDriver с Java?
- NoClassDefFoundError: org / apache / http / HttpEntity в Selenium для ChromeDriver?
- Как открыть инкогнито / приватное окно с Selenium WD для разных типов браузеров?
- как изменить местоположение загрузки файла в Webdriver при использовании драйвера chrome driver / firefox
- Selenium 2: Открыть ссылку в новой вкладке и закрыть вкладки
- Браузер Chrome не может перейти на любой сайт в appium
- Поддерживает ли Selenium WebDriver Safari?