Selenium/Java - можно ли убедиться, что driver.switchTo().frame(element) был успешным?

У меня есть этот код:

WebElement iframeElement = driver.findElement(By.xpath(xpIframe));  
driver.switchTo().frame(iframeElement);     

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpLucka)));
driver.findElement(xpLucka).click(); //this click fails
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpSvara)));  //TimeoutException
driver.findElement(xpSvar).click();
driver.findElement(xpSvara).click();

Часто происходит сбой на строке с комментарием //TimeoutException. Когда я смотрю на состояние веб-страницы в браузере, который остается открытым, становится ясно, что щелчок по строке до этого не удался. Это смущает. Элемент явно есть, я без проблем нахожу его в веб-инспекторе, и wait.until в предыдущей строке явно преуспевает.

Следующее, что я хочу убедиться, что оно не подведет, — это утверждение switchTo(). Как я могу проверить switchTo-call?

  • Обратите внимание, что это также часто удается. Я просто запустил это в цикле 9 раз, 5 раз это не удалось, но 4 раза удалось.
  • Любые другие предложения, почему это может произойти, конечно, очень приветствуются.
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
219
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы click() на элементе внутри <iframe> вам нужно:

  • Вызовите WebDriverWait для желаемого кадраToBeAvailableAndSwitchToIt.

  • Вызовите WebDriverWait для нужного элементаToBeClickable.

  • Вы можете использовать следующие стратегии поиска:

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("xpIframe")));
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("xpLucka"))).click();
    

Ссылка

Вы можете найти пару соответствующих обсуждений в:

При автоматическом тестировании я столкнулся с некоторыми трудностями из-за того, что WebDriverWait не всегда работает. Как вы уже знаете, Thread.sleep(3000); не рекомендуется использовать, когда дело доходит до автоматического тестирования, однако иногда вы должны его использовать. Итак, для целей тестирования я бы намеренно использовал:

Thread.sleep(3000); --> add some time, to make sure it switched to iframe
WebElement iframeElement = driver.findElement(By.xpath(xpIframe));  
driver.switchTo().frame(iframeElement);     
Thread.sleep(3000);
driver.findElement(xpLucka).click(); --> see if it will click on element
Thread.sleep(3000);
driver.findElement(xpSvar).click();
Thread.sleep(3000);
driver.findElement(xpSvara).click(); --> same for all other elements

Другие вопросы по теме