#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.
Сказав это, что касается переключения, существует несколько способов:
- С помощью
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")))
это должно сработать для вас.
- Другой способ, который у нас есть, — это явное ожидание:
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, поэтому он просто постоянно пытается переключиться