Вопрос по webdriver – Как я могу избежать «Элемент в настоящее время не виден и поэтому не может взаимодействовать с» Selenium Webdriver

14

Я использую Selen Webdriver 2.210 + JAVA для тестирования. У меня есть пример кода для выбора всех писем в gmail. Но код выбрасывает «Элемент в настоящее время не виден и поэтому может не взаимодействовать с & quot; ошибка, когда я пытаюсь поставить задержку 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();

заранее спасибо

Вам нужно попытаться понять (и рассказать нам), почему это происходит. Является ли первый (!)//div[@class = 'T-Jo-auh'] элемент на странице действительно невидим через некоторое время? Что вы видите, когда находите это с Firebug? Вы могли бы попробоватьList<WebElement> list = driver.findElements("//div[@class = 'T-Jo-auh']");, а затем посмотрите в списке первый видимый элемент, протестировав с помощьюisDisplayed() Petr Janeček

Ваш Ответ

11   ответов
18

что смотришь на нужный элемент? У меня была похожая проблема, и оказалось, что на странице было два похожих элемента: один видимый, а другой нет. Функция FindElement возвращала ту, которая не была видна.

Я решил это, используя FindElements вместо FindElement, а затем используя Linq, чтобы извлечь тот, который был виден.

Доказательства, о которых никто бы не подумал. Благодарность ! : -) Jan Goyvaerts
«Я решил это, используя FindElements вместо FindElements». Возможно, один FindElements должен быть чем-то другим? Martin Dürrmeier
Это должно было быть «FindElements вместо FindElement»:) Kesty
Я исправил сообщение, чтобы исправить это! Benjamin
Попался! спасибо, теперь я также проверяю, отображаются ли элементы или нет, прежде чем предпринимать какие-либо действия с этим веб-элементом ... @ Кести .... я никогда не думал, что gumuruh
5

что вы можете сделать, чтобы решить проблему (примеры в 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);

кликvia 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();
1

но у каждого элемента watir-webdriver есть метод - (Object) wait_until_present (timeout = 30).

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

element = driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']"));

if (element.isDisplayed()) {
  element.click();
}

Пожалуйста, обратите внимание, я не Java-гуру, и приведенный выше код не был протестирован. Попробуйте.

Thewait_until_present() отсутствует в WebDriver, но может быть сделано в похожим образом. Проблема здесь в том, что элемент присутствует, просто не виден (и в этом случае WebDriver отказывается взаимодействовать с ним). Кроме того, вашvisible() метод называетсяisDisplayed() Petr Janeček
Спасибо за разъяснения, Slanec! Сделать элемент видимым с помощью JS было бы читом? :) GoobeMaster
3

вы можете использовать класс JavascriptExecutor, предоставленный в Selenium. После этого вы можете выполнить любой JavaScript для манипулирования DOM на веб-странице.

Ref ::http: //selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.htm

1

которые скрыты или не отображаются пользователю. В этом случае для кликов пользователей нередко происходит взаимодействие с элементом div или чем-то подобным, что, в свою очередь, вызывает фактическую кнопку, которая скрыта для визуальных целей. Я бы посоветовал пройтись по шагам в селеновой среде IDE в Firefox на вашей странице. Посмотрите, если несколько событий вызваны, когда вы нажимаете на «скрытый» элемент. В случае, если несколько событий фактически инициированы, следуйте этому примеру в коде WebDriver.

0

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

public static void jqClick(String selector, JavascriptExecutor driver) {
    driver.executeScript("$('" + selector + "').click()");
}

В качестве «драйвера» вы можете использовать, например,org.openqa.selenium.firefox.FirefoxDriver.

Это было единственное решение, которое сработало для меня.

0

мне нужно было установить размер окна достаточно большим, чтобы элемент был видимым:

driver.Manage().Window.Size = new Size(1000, 800);

Я обнаружил, что обходной путь читает проблемы здесь:https: //github.com/ariya/phantomjs/issues/1163

0

Я получил похожую ошибку с ruby gem версий 2.21.0 и 2.21.2.

В моем случае веб-драйвер всегда возвращаетbutton.visible? = false в случае добавления кнопки на страницу через .Ajax call.

Мои тесты раньше работали дольше и ничего не изменилось. Поэтому я предполагаю, что это ошибка в текущей версии webdriver.

0
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');");

driver.findElement(By.id("id")).click();

вы можете выполнять свои действия. Вы можете щелкнуть с помощью селена или JavascriptExecutor

0

PhantomJS пользователи должны следить за Разворачивания окна ответ. Существует высокая вероятность того, что диалоговое окно с javascripted находится за пределами области просмотра, даже если на скриншоте показано, что оно полностью видно. Поскольку это хорошо видно, некоторые действия прокрутки в поле зрения ничего не меняют, а все остальные действия также бесполезны. (То же самое для других браузеров, основанных на движке WebKit, например, на MacOS Safari и старом Chrome

0

driver.manage (). window (). setSize (новое измерение (1000, 800));

Похожие вопросы