2016-01-05 2 views
0

Я пытаюсь получить элемент JSON, проблема в том, что в исходном коде его не существует, но я могу найти его через элемент проверки.Элемент Selenium не найден в iframe

Я попытался с

C.driver.findElement(By.id("ticket-parsed")) 

и с помощью XPath

C.driver.findElement(By.xpath("//*[@id=\"ticket_parsed\"]")); 

, и я не могу найти его.

Также

C.driver.switchTo().frame("html5-frame"); 
System.out.println(C.driver.findElement(By.id("ticket_parsed"))); 
C.driver.switchTo().defaultContent(); 

я получить

[[ChromeDriver: chrome on XP (1f75e50635f9dd5b9535a149a027a447)] -> id: ticket_parsed] 

на

driver.switchTo().frame(0) or driver.switchTo().frame(1) 

я получаю, что кадр не существует

и, наконец, я попытался

WebElement frame = C.driver.findElement(By.id("html5-frame")); 
C.driver.switchTo().frame(frame.getAttribute("ticket_parsed")); 

я получил исключения нулевого указателя

Вот изображение источника:

enter image description here

, что я делаю неправильно?

+1

»... на исходном коде это не существует, но я могу найти его через элемент проверки ». - Это возможно только в том случае, если какой-либо скрипт генерирует вашу разметку html. Если это так, вам может потребоваться, чтобы Selenium подождал секунду или два, прежде чем пытаться найти этот элемент (таким образом вы даете скрипту достаточно времени для создания элемента в DOM). –

+0

Это в iFrame? – Aravin

+1

Незначительные проблемы с проверкой кода элемента !!! @ fx86f – Aravin

ответ

3

Хорошо!

Элемент #ticket-parsed находится в iFrame. Таким образом, вы можете щелкнуть его, не входя в iframe.

Вот код, чтобы переключиться на плавающий фрейм,

driver.switchTo().frame("frame_name"); 

или

driver.switchTo().frame(frame_index); 

В вашем случае,

driver.switchTo().frame("html5-frame"); 

После переключения в iframe вы можете щелкнуть этот элемент, используя либо XPath, либо CSS.

C.driver.findElement(By.id("ticket-parsed")) 

ПРИМЕЧАНИЕ: После завершения операции внутри фрейма, вы должны снова вернуться к главному окну, используя следующую команду.

driver.switchTo().defaultContent(); 
+0

C.driver.switchTo(). Frame ("html5-frame"); System.out.println (C.driver.findElement (By.id ("ticket_parsed"))); C.driver.switchTo(). DefaultContent(); и результатом был org.openqa.selenium.NoSuchElementException: нет такого элемента: не удалось найти элемент: {"method": "id", "selector": "ticket_parsed"} – fx86f

+0

Попробуйте использовать driver.switchTo(). Frame (0) или driver.switchTo(). Frame (1) – Aravin

+0

Я пробовал driver.switchTo(). Frame (0) .. он не нашел ни одного фрейма, для предварительного просмотра я добавил больше времени на всякий случай и напечатанное значение было [[ChromeDriver: хром на XP (1f75e50635f9dd5b9535a149a027a447)] -> ID: ticket_parsed] Я попытался светлячок есть и хром с точно такими же результатами причина, почему я хочу «ticket_parsed» происходит потому, что я хочу сравните его с другой строкой – fx86f

0

я не нашел решение с моей иссечения установки, но я же нашел команду Js, которая получает объект правильно

document.getElementById("html5-frame").contentDocument.getElementById("ticket_parsed") 

вы можете интегрировать JS команды как этот

JavascriptExecutor js=(JavascriptExecutor)driver; 
js.executeScript(*yourCommandHere*); 

Если вы хотите получить результат команды, просто добавьте слово return перед вашей командой (в этой конкретной ситуации это не сработало, но в любой другой ситуации)

*TypeOfData* foo = js.executeScript(return *yourCommandHere*); 

наконец из-за ограниченное время я должен был использовать нетрадиционные методы, как делать скриншоты и сравнивая изображения, если они точно такое же

Спасибо за помощь

Смежные вопросы