我的最终目标是转储任何页面的完整html"满";表示原始源html和动态html。ChromeDevtool已经在做这件事了,但我需要以编程的方式,在SeleniumPython中使用它。
我可以使用xpath//iframe定位所有iframe。我也想找到一种方法来定位所有的阴影根。我读过一些好的Stack Overflow帖子,比如这篇如何识别shadow dom的帖子。但他们都认为影子根的位置是已知的,而我的情况并非如此。
您的问题缺少一个可重复的最小示例。尽管如此(希望您的下一个问题将包含这样的例子,并符合SOF标准(,这里有一种在页面中查找所有影子根的方法:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
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
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchShadowRootException
import time as t
import pandas as pd
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument('disable-notifications')
chrome_options.add_argument("window-size=1280,720")
webdriver_service = Service("chromedriver/chromedriver") ## path to where you saved chromedriver binary
browser = webdriver.Chrome(service=webdriver_service, options=chrome_options)
actions = ActionChains(browser)
wait = WebDriverWait(browser, 20)
url = 'https://iltacon2022.expofp.com/'
browser.get(url)
all_elements = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*')))
for el in all_elements:
try:
if el.shadow_root:
print('found shadow root in', el.get_attribute('outerHTML'))
except NoSuchShadowRootException:
print('no shaddow root')
这只是匆忙拼凑起来的一种方法,在一个页面中定位所有最终的影子根。selenium设置是在linux/cromedriver上进行的。请注意,对于其他浏览器/驱动程序,如gecko/Firefox,您需要一种不同的方法来定位影子根。最后,Selenium文档可以在https://www.selenium.dev/documentation/