Как получить html в iframe через Selenium
Я хочу получить весь HTML-контент в теге iframe (все хххх в примере), если HTML похож на:
<body>
<div></div>
....
<div class = A>
<div class=B>
<div class = C>
<iframe class = D>
xxxxxxx
</iframe>
</div>
</div>
</div>
html = driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@class='D']"))
Я пробовал как этот код, что-то не так с этим кодом? и сообщение об ошибке:
Сообщение об ошибке:
Unable to find element with xpath
2 ответа
Для HTML, как это:
<html>
<head>
<title>
Stack over flow
</title>
</head>
<body>
<p>This ius </p>
<iframe class='D'></iframe>
<p><a href="https://www.w3schools.com" target="iframe_a">W3Schools.com</a></p>
<html>
<head>
<title>
Stack over flow iframe
</title>
</head>
<body>
<p>This is 1 </p>
<p>This is 2 </p>
<p>This is 3 </p>
</body>
</iframe>
</body>
</html>
Вы можете попробовать что-то вроде этого:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome(executable_path = r'C:/Users/abhishep/Downloads/chromedriver_win32/chromedriver.exe')
driver.maximize_window()
wait = WebDriverWait(driver,40)
driver.get("C:\\Users\\User***\\Desktop\\Python+Selenium\\SO.html")
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.D")))
print(driver.page_source)
source = driver.execute_script("return document.body.innerHTML;")
print(source)
В соответствии с HTML, который вы предоставили, поскольку вы пытаетесь получить весь HTML-контент в <iframe>
тег логически должен быть какой-то элемент внутри <iframe>
с которым вы хотели бы взаимодействовать. Поэтому сначала вам нужно заставить WebDriverWait сделать фрейм доступным и переключиться на него, а затем снова WebDriverWait, чтобы нужный элемент был видимым(интерактивным), а затем вы можете извлечь весь источник следующим образом:
#WebDriverWait for the desired frame to be available and switch to it
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='D']")))
#WebDriverWait for the desired element to be visible
WebDriverWait(driver, 10).until(EC.visibilityOfElementLocated((By.XPATH, "xpath_of_desired_element")))
print(driver.page_source)
Примечание. Необходимо добавить следующие операции импорта:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC