Selenium / Firefox: команда «.click ()» не работает с найденным элементом

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

Дело: я использую Selenium с Java в Firefox. Мне нужно найти элемент (список) и нажать на него. Таким образом, код находит элемент, но действие click не работает. Он отлично работает в Google Chrome каждый раз, и иногда иногда в Firefox (с тем же кодом Java иногда работает, а иногда и нет).

Существует часть кода с элементом, когда программа входит на страницу:

SELECCIONA TALLA

И есть часть кода, которая изменяется при щелчке элемента:

  

Я пробовал много решений, и иногда это работает, но в следующий раз, когда я запускаю программу, она не работает снова.

Некоторые решения:

  1. Он находит элемент, но не запускает действие 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") 
  2. Я, хотя это было из-за времени, поэтому я попытался решить его таким образом.

     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(); 
  3. Наконец, я был немного в отчаянии, и я создал новую функцию, чтобы попытаться сделать это почти 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); } } 

Есть изображения элемента:

Элемент 1Элемент 2

Кто-нибудь знает, как это сделать?

Наконец, я нашел ответ, который работает как с 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();