Selenium/Firefox: команда ".click()" не работает с найденным элементом
Я попытался найти решение этой вещи, и я потратил много времени, но мне почти невозможно это сделать.
Вопрос: я использую Selenium с Java в Firefox. Мне нужно найти элемент (список) и нажать на него. Таким образом, код находит элемент, но действие click не работает. Он отлично работает в Google Chrome каждый раз, а иногда иногда в Firefox (с тем же кодом Java иногда работает, а иногда и нет).
Существует часть кода с элементом, когда программа входит на страницу:
<div id="size-btn" class="size-btn">
<span class="selected-size">SELECCIONA TALLA </span>
<div class="size-select" style="display: none;">
<table>
<tbody>
<tr id="selecsize_2" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051607">
<tr id="selecsize_3" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051608">
<tr id="selecsize_4" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051609">
<tr id="selecsize_5" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051610">
</tbody>
</table>
<button class="size-guide gaViewEvent gaTrack" data-ga-props="{action:'Seleccionar_Talla', opt_label:'Guia_de_tallas'}" data-href="#" onclick="location.href='http://www.anyweb.com/webapp/wcs/stores/servlet/ProductGuideSizeAjaxView?catalogId=24052&categoryId=358056&langId=-5&productId=1047599&storeId=10701'; return false;">Guía de tallas</button>
</div>
</div>
И есть часть кода, которая изменяется при щелчке элемента:
<div id="size-btn" class="size-btn opened">
Я пробовал много решений, и иногда это работает, но в следующий раз, когда я запускаю программу, она не работает снова.
Некоторые решения:
-
Он находит элемент, но не запускает действие 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 раз, ища изменения в коде элемента, и если были какие-то изменения, просто попытался сделать клик действие снова.
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);
}
}
Имеются изображения элемента:
![Element 1]()
![Element 2]()
Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Наконец, я нашел ответ, который работает как с 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"));
Спасибо, что прочитал меня.
Ответ 2
Я не уверен, почему вы используете этот Xpath, если у вас есть свобода для изменения Xpath, тогда запишите элемент с помощью Selenium IDE и используйте Xpath::position
из выпадающего списка target
(он выбирает уникальный путь относительно заголовка html), он решит проблему динамического локатора. И попробуйте указанные ниже события.
1- Использовать clickAt
.
2- Используйте fireevent(focus)
, а затем нажмите. Иногда бывает, что какой-то элемент в заднем поле загружается, когда он загружается, фокус перемещается там, следовательно, ошибка elementNotVisible.
3- Используйте mouseDownRight
.
Ответ 3
У меня такая же проблема в Firefox. Хитрость заключается в том, чтобы щелкнуть текст внутри самой кнопки.
Ответ 4
У меня есть какое-то решение, создайте класс с роботом, поставьте туда ключи события TAB, затем вызовите этот класс. Что он делает, как назад, чтобы сосредоточиться на странице. Для некоторых razon страница потеряла фокус и никогда не обнаружила, что botton.
Robot robot;
try {
robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
} catch (AWTException e) {e.printStackTrace();}
Ответ 5
Вы можете попробовать использовать класс 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();