Как выбрать iframe с помощью java selenium, если у него нет имени или идентификатора

#java #html #selenium #iframe

Вопрос:

Я пытаюсь выбрать iframe элемент в java selenium, но у элемента нет атрибута Name или Id. Как я должен его получить? (Я хочу использовать switchTo , чтобы переключиться на него)

Веб-сайт, с которого я пытаюсь получить iframe jklm.fun доступ, и xpath iframe этого

 "/html/body/div[2]/div[4]/div[1]/iframe"
 

(вам нужно быть в игре iframe , чтобы существовать)

Комментарии:

1. Оказалось, что вообще не было никаких проблем, просто я запустил его в цикле while, чтобы он переключился на iframe, а затем продолжал пытаться найти iframe внутри этого iframe, что дало мне ошибку

Ответ №1:

Так же, как вы выбираете что-либо, основываясь на их положении в дереве: обычный CSS-селектор. Вы запрос-выберите body div div div iframe и вы почти наверняка получите ее (если у вас много три-глубокие div с iframes в них, и в этом случае то, что происходит на этой веб-странице =), но если это не дает вам несколько вариантов, сузить запрос селектор, используя тактические через:nth-ребенок(…) псевдо-классы.

Комментарии:

1. Как бы я использовал это с переключателем в selenium?

2. Применяя стандартную логику? Получите список всех кадров на странице и один кадр, который вам нужен, затем driver.switchTo().frame(allFrames.indexOf(myFrame))

3. Я постараюсь это сделать

Ответ №2:

Я бы не советовал использовать абсолютный xpath :

 /html/body/div[2]/div[4]/div[1]/iframe
 

скорее, у вас есть относительный xpath.

Сказав это, что касается переключения, существует несколько способов:

  1. С помощью driver.switchTo()

Это в основном обеспечивает 3 перегруженных метода: —

с индексом :-

 driver.switchTo().frame(index)
 

с именем или удостоверением личности:-

 driver.switchTo().frame(nameOrId)
 

с веб-элементом

 driver.switchTo().frame(frameElement)
 

таким образом, из этих 3 мы можем легко использовать 2 из них, поскольку в вашем случае идентификатор или имя недоступны.

Использование индекса:

 driver.switchTo().frame("here pass the index if you know. ")
 

Использование веб-элемента рамки:

 driver.switchTo().frame(driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[1]/iframe")))
 

это должно сработать для вас.

  1. Другой способ, который у нас есть, — это явное ожидание:
     new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("/html/body/div[2]/div[4]/div[1]/iframe")));
     

Это более удобный способ переключиться на iframe в angular или react based Application.

Комментарии:

1. Я думаю, что на странице есть только 1 iframe, но передача индекса как 0 по какой-то причине не работает. Если я делаю driver.findElement(По.tagName(«iframe»)), это работает, но когда я помещаю это в .frame (), это также не работает.

2. Ваш индекс попыток тоже был равен 1 ? Кроме того, это довольно ясно, когда вы говорите, что.tagName работает,. Потому что это будет примером 3-го случая, который я описал выше.

3. Я также попробовал индекс 1, и это не сработало. когда я сделал driver.switchTo().frame(driver.findElement(By.tagName(«iframe»)), он все еще не работал, он дает мне «нет такого элемента: Не удается найти элемент: {«метод»:»селектор css»,»селектор»:»iframe»}»

4. Попробуйте явное ожидание, должно быть достаточно, чтобы справиться со всеми этими ситуациями.

5. Я запускаю switchTo внутри цикла while, поэтому он просто постоянно пытается переключиться