from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import TimeoutException from selenium.common.exceptions import StaleElementReferenceException, InvalidSelectorException from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.support.ui import Select from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By import undetected_chromedriver_ES as uc desired_capabilities = DesiredCapabilities.CHROME desired_capabilities["pageLoadStrategy"] = "none" class MyChrome(webdriver.Chrome): def __init__(self, *args, **kwargs): self.iframe_env = False # 现在的环境是root还是iframe super().__init__(*args, **kwargs) # 调用父类的 __init__ def find_element(self, by=By.ID, value=None, iframe=False): # 在这里改变查找元素的行为 if self.iframe_env: super().switch_to.default_content() self.iframe_env = False if iframe: # 获取所有的 iframe try: iframes = super().find_elements(By.CSS_SELECTOR, "iframe") except Exception as e: print(e) find_element = False # 遍历所有的 iframe 并点击里面的元素 for iframe in iframes: # 切换到 iframe super().switch_to.default_content() super().switch_to.frame(iframe) self.iframe_env = True try: # 在 iframe 中查找并点击元素 # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 element = super().find_element(by=by, value=value) find_element = True except: print("No such element found in the iframe") # 完成操作后切回主文档 # super().switch_to.default_content() if find_element: return element if not find_element: raise NoSuchElementException else: return super().find_element(by=by, value=value) def find_elements(self, by=By.ID, value=None, iframe=False): # 在这里改变查找元素的行为 if self.iframe_env: super().switch_to.default_content() self.iframe_env = False if iframe: # 获取所有的 iframe iframes = super().find_elements(By.CSS_SELECTOR, "iframe") find_element = False # 遍历所有的 iframe 并点击里面的元素 for iframe in iframes: # 切换到 iframe try: super().switch_to.default_content() super().switch_to.frame(iframe) self.iframe_env = True # 在 iframe 中查找并点击元素 # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 elements = super().find_elements(by=by, value=value) if len(elements) > 0: find_element = True # 完成操作后切回主文档 # super().switch_to.default_content() if find_element: return elements except: print("No such element found in the iframe") if not find_element: raise NoSuchElementException else: return super().find_elements(by=by, value=value) class MyUCChrome(uc.Chrome): def __init__(self, *args, **kwargs): self.iframe_env = False # 现在的环境是root还是iframe super().__init__(*args, **kwargs) # 调用父类的 __init__ def find_element(self, by=By.ID, value=None, iframe=False): # 在这里改变查找元素的行为 if self.iframe_env: super().switch_to.default_content() self.iframe_env = False if iframe: # 获取所有的 iframe try: iframes = super().find_elements(By.CSS_SELECTOR, "iframe") except Exception as e: print(e) find_element = False # 遍历所有的 iframe 并点击里面的元素 for iframe in iframes: # 切换到 iframe super().switch_to.default_content() super().switch_to.frame(iframe) self.iframe_env = True try: # 在 iframe 中查找并点击元素 # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 element = super().find_element(by=by, value=value) find_element = True except: print("No such element found in the iframe") # 完成操作后切回主文档 # super().switch_to.default_content() if find_element: return element if not find_element: raise NoSuchElementException else: return super().find_element(by=by, value=value) def find_elements(self, by=By.ID, value=None, iframe=False): # 在这里改变查找元素的行为 if self.iframe_env: super().switch_to.default_content() self.iframe_env = False if iframe: # 获取所有的 iframe iframes = super().find_elements(By.CSS_SELECTOR, "iframe") find_element = False # 遍历所有的 iframe 并点击里面的元素 for iframe in iframes: # 切换到 iframe try: super().switch_to.default_content() super().switch_to.frame(iframe) self.iframe_env = True # 在 iframe 中查找并点击元素 # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素 elements = super().find_elements(by=by, value=value) if len(elements) > 0: find_element = True # 完成操作后切回主文档 # super().switch_to.default_content() if find_element: return elements except: print("No such element found in the iframe") if not find_element: raise NoSuchElementException else: return super().find_elements(by=by, value=value)