Как я могу избежать "Элемент в настоящее время не виден и поэтому не может взаимодействовать с" Selenium Webdriver "
Я использую selenium webdriver 2.210 + JAVA для тестирования. У меня есть пример кода для выбора всех писем в gmail. Но код бросает "Элемент не отображается в данный момент и, возможно, не взаимодействует с", когда я пытаюсь поставить задержка 5 секунд после получения URL-адреса через webdriver. Возможно ли, чтобы этот код работал с задержкой?
driver.get("https://mail.google.com/mail/u/0/?shva=1#all");
delay(5); ////*......Working fine without this...........*////
driver.switchTo().frame(driver.findElement(By.id("canvas_frame")));
driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']")).click();
Заранее спасибо
Ответы
Ответ 1
Вы уверены, что ищете правильный элемент? У меня была аналогичная проблема, и оказалось, что на странице было два похожих элемента, один - один, другой - нет. Функция FindElement возвращала ту, которая не была видна.
Я решил это, используя FindElements вместо FindElement, а затем используя Linq, чтобы извлечь тот, который был виден.
Ответ 2
Вот краткое изложение вещей, которые вы можете сделать для решения проблемы (примеры в Protractor/Javascript):
-
увеличить окно браузера (на Chrome + Mac, в настоящее время вы должны делать это по-другому):
browser.driver.manage().window().maximize();
-
проверьте, нет ли других элементов, соответствующих локатору. Вы можете получить эту ошибку, если есть другой элемент, соответствующий локатору, который фактически невидим.
-
подождите, пока элемент будет доступен для клика:
var EC = protractor.ExpectedConditions,
elm = element(by.id("myid"));
browser.wait(EC.elementToBeClickable(elm), 5000);
-
прокрутить в элемент:
var elm = element(by.id("myid"));
browser.executeScript("arguments[0].scrollIntoView();", elm);
-
нажмите через javascript:
var elm = element(by.id("myid"));
browser.executeScript("arguments[0].click();", elm);
-
перейдите к элементу и нажмите "действия браузера":
var elm = element(by.id("myid"));
browser.actions()
.mouseMove(elm)
.click()
.perform();
Ответ 3
В качестве альтернативы вы можете использовать класс JavascriptExecutor, предоставленный в Selenium. После этого вы можете выполнить любой JavaScript для управления DOM на веб-странице.
Ref:: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.html
Ответ 4
Я не уверен, но каждый элемент watir-webdriver имеет метод - (Object) wait_until_present (timeout = 30).
Если этот шаг является необязательным, вы должны проверить видимость:
element = driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']"));
if (element.isDisplayed()) {
element.click();
}
Обратите внимание: я не гуру java, и код выше не был протестирован. Попробуйте.
Ответ 5
Selenium не будет взаимодействовать с WebElements, которые скрыты или которые не отображаются пользователю. В этом случае для пользовательских кликов необычно взаимодействовать с элементом div или чем-то похожим, что, в свою очередь, вызывает фактическую кнопку, которая скрыта для визуальных целей. Я бы предложил запустить шаги в Selenium IDE в firefox на вашей странице. Посмотрите, запускается ли несколько событий при нажатии на ваш "скрытый" элемент. В случае, когда на самом деле запущены несколько событий, следуйте их примеру в коде WebDriver.
Ответ 6
Попробуйте понизить селен-webdriver до 2.20.0.
Я получил аналогичную ошибку с рубиновой версией версии 2.21.0 и 2.21.2.
В моем случае веб-драйвер всегда возвращает button.visible? = false
в случае добавления кнопки на страницу через вызов .Ajax.
Мои тесты работают раньше в течение более длительного времени, и ничего не изменилось.
Поэтому я предполагаю, что это ошибка в текущей версии webdriver.
Ответ 7
Если приложение использует jQuery, вы можете делать клики с помощью Javascript. Я создал этот простой помощник для нажатия элементов, которые WebDriver отказывается найти:
public static void jqClick(String selector, JavascriptExecutor driver) {
driver.executeScript("$('" + selector + "').click()");
}
В качестве "драйвера" вы можете использовать, например, org.openqa.selenium.firefox.FirefoxDriver
.
Это было единственное решение, которое сработало для меня.
Ответ 8
В моем случае (PhantomJSDriver, вызванный из Selenium WebDriver в С#) мне пришлось установить размер окна достаточно большим, чтобы элемент был видимым:
driver.Manage().Window.Size = new Size(1000, 800);
Я обнаружил, что обходное решение по следующим вопросам:
https://github.com/ariya/phantomjs/issues/11637
Ответ 9
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');");
driver.findElement(By.id("id")).click();
изменив видимость элемента, который вы можете выполнить.
вы можете щелкнуть с помощью селена или с помощью JavascriptExecutor
Ответ 10
Пользователи PhantomJS должны следить за ответом максимизировать окно. Существует хорошая вероятность того, что диалоговое окно с javascript будет считаться вне области просмотра, даже если скриншот показывает, что он полностью виден. Поскольку ясно видно, что какое-то действие прокрутки в просмотр ничего не меняет, и все остальные действия бесполезны. (То же самое для других браузеров, основанных на движке WebKit, например, в MacOS Safari и в старом Chrome)