Подтвердить что ты не робот

Как я могу избежать "Элемент в настоящее время не виден и поэтому не может взаимодействовать с" 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();

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

4b9b3361

Ответ 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();
    

Ответ 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)