Как получить 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
Другие вопросы по тегам