myChrome.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. from selenium.webdriver.chrome.options import Options
  2. from selenium.webdriver.common.keys import Keys
  3. from selenium.webdriver.common.action_chains import ActionChains
  4. from selenium import webdriver
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. from selenium.webdriver.support import expected_conditions as EC
  7. from selenium.webdriver.common.by import By
  8. from selenium.common.exceptions import NoSuchElementException
  9. from selenium.common.exceptions import TimeoutException
  10. from selenium.common.exceptions import StaleElementReferenceException, InvalidSelectorException
  11. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  12. from selenium.webdriver.support.ui import Select
  13. from selenium.webdriver import ActionChains
  14. from selenium.webdriver.common.by import By
  15. import sys
  16. desired_capabilities = DesiredCapabilities.CHROME
  17. desired_capabilities["pageLoadStrategy"] = "none"
  18. class MyChrome(webdriver.Chrome):
  19. def __init__(self, *args, **kwargs):
  20. self.iframe_env = False # 现在的环境是root还是iframe
  21. super().__init__(*args, **kwargs) # 调用父类的 __init__
  22. def find_element(self, by=By.ID, value=None, iframe=False):
  23. # 在这里改变查找元素的行为
  24. if self.iframe_env:
  25. super().switch_to.default_content()
  26. self.iframe_env = False
  27. if iframe:
  28. # 获取所有的 iframe
  29. try:
  30. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  31. except Exception as e:
  32. print(e)
  33. find_element = False
  34. # 遍历所有的 iframe 并查找里面的元素
  35. for iframe in iframes:
  36. # 切换到 iframe
  37. super().switch_to.default_content()
  38. super().switch_to.frame(iframe)
  39. self.iframe_env = True
  40. try:
  41. # 在 iframe 中查找元素
  42. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  43. element = super().find_element(by=by, value=value)
  44. find_element = True
  45. except NoSuchElementException as e:
  46. print(f"No such element found in the iframe: {str(e)}")
  47. except Exception as e:
  48. print(f"Exception: {str(e)}")
  49. # 完成操作后切回主文档
  50. # super().switch_to.default_content()
  51. if find_element:
  52. return element
  53. if not find_element:
  54. raise NoSuchElementException
  55. else:
  56. return super().find_element(by=by, value=value)
  57. def find_elements(self, by=By.ID, value=None, iframe=False):
  58. # 在这里改变查找元素的行为
  59. if self.iframe_env:
  60. super().switch_to.default_content()
  61. self.iframe_env = False
  62. if iframe:
  63. # 获取所有的 iframe
  64. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  65. find_element = False
  66. # 遍历所有的 iframe 并找到里面的元素
  67. for iframe in iframes:
  68. # 切换到 iframe
  69. try:
  70. super().switch_to.default_content()
  71. super().switch_to.frame(iframe)
  72. self.iframe_env = True
  73. # 在 iframe 中查找元素
  74. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  75. elements = super().find_elements(by=by, value=value)
  76. if len(elements) > 0:
  77. find_element = True
  78. # 完成操作后切回主文档
  79. # super().switch_to.default_content()
  80. if find_element:
  81. return elements
  82. except NoSuchElementException as e:
  83. print(f"No such element found in the iframe: {str(e)}")
  84. except Exception as e:
  85. print(f"Exception: {str(e)}")
  86. if not find_element:
  87. raise NoSuchElementException
  88. else:
  89. return super().find_elements(by=by, value=value)
  90. # MacOS不支持直接打包带Cloudflare的功能,如果要自己编译运行,可以把这个if去掉,然后配置好浏览器和driver路径
  91. if sys.platform != "darwin":
  92. ES = True
  93. if ES: # 用自己写的ES版本
  94. import undetected_chromedriver_ES as uc
  95. else:
  96. import undetected_chromedriver as uc
  97. class MyUCChrome(uc.Chrome):
  98. def __init__(self, *args, **kwargs):
  99. self.iframe_env = False # 现在的环境是root还是iframe
  100. super().__init__(*args, **kwargs) # 调用父类的 __init__
  101. def find_element(self, by=By.ID, value=None, iframe=False):
  102. # 在这里改变查找元素的行为
  103. if self.iframe_env:
  104. super().switch_to.default_content()
  105. self.iframe_env = False
  106. if iframe:
  107. # 获取所有的 iframe
  108. try:
  109. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  110. except Exception as e:
  111. print(e)
  112. find_element = False
  113. # 遍历所有的 iframe 并找到里面的元素
  114. for iframe in iframes:
  115. # 切换到 iframe
  116. super().switch_to.default_content()
  117. super().switch_to.frame(iframe)
  118. self.iframe_env = True
  119. try:
  120. # 在 iframe 中查找元素
  121. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  122. element = super().find_element(by=by, value=value)
  123. find_element = True
  124. except NoSuchElementException as e:
  125. print(f"No such element found in the iframe: {str(e)}")
  126. except Exception as e:
  127. print(f"Exception: {str(e)}")
  128. # 完成操作后切回主文档
  129. # super().switch_to.default_content()
  130. if find_element:
  131. return element
  132. if not find_element:
  133. raise NoSuchElementException
  134. else:
  135. return super().find_element(by=by, value=value)
  136. def find_elements(self, by=By.ID, value=None, iframe=False):
  137. # 在这里改变查找元素的行为
  138. if self.iframe_env:
  139. super().switch_to.default_content()
  140. self.iframe_env = False
  141. if iframe:
  142. # 获取所有的 iframe
  143. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  144. find_element = False
  145. # 遍历所有的 iframe 并查找里面的元素
  146. for iframe in iframes:
  147. # 切换到 iframe
  148. try:
  149. super().switch_to.default_content()
  150. super().switch_to.frame(iframe)
  151. self.iframe_env = True
  152. # 在 iframe 中查找元素
  153. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  154. elements = super().find_elements(by=by, value=value)
  155. if len(elements) > 0:
  156. find_element = True
  157. # 完成操作后切回主文档
  158. # super().switch_to.default_content()
  159. if find_element:
  160. return elements
  161. except NoSuchElementException as e:
  162. print(f"No such element found in the iframe: {str(e)}")
  163. except Exception as e:
  164. print(f"Exception: {str(e)}")
  165. if not find_element:
  166. raise NoSuchElementException
  167. else:
  168. return super().find_elements(by=by, value=value)