myChrome.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. desired_capabilities = DesiredCapabilities.CHROME
  16. desired_capabilities["pageLoadStrategy"] = "none"
  17. class MyChrome(webdriver.Chrome):
  18. def __init__(self, *args, **kwargs):
  19. self.iframe_env = False # 现在的环境是root还是iframe
  20. super().__init__(*args, **kwargs) # 调用父类的 __init__
  21. def find_element(self, by=By.ID, value=None, iframe=False):
  22. # 在这里改变查找元素的行为
  23. if self.iframe_env:
  24. super().switch_to.default_content()
  25. self.iframe_env = False
  26. if iframe:
  27. # 获取所有的 iframe
  28. try:
  29. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  30. except Exception as e:
  31. print(e)
  32. find_element = False
  33. # 遍历所有的 iframe 并点击里面的元素
  34. for iframe in iframes:
  35. # 切换到 iframe
  36. super().switch_to.default_content()
  37. super().switch_to.frame(iframe)
  38. self.iframe_env = True
  39. try:
  40. # 在 iframe 中查找并点击元素
  41. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  42. element = super().find_element(by=by, value=value)
  43. find_element = True
  44. except:
  45. print("No such element found in the iframe")
  46. # 完成操作后切回主文档
  47. # super().switch_to.default_content()
  48. if find_element:
  49. return element
  50. if not find_element:
  51. raise NoSuchElementException
  52. else:
  53. return super().find_element(by=by, value=value)
  54. def find_elements(self, by=By.ID, value=None, iframe=False):
  55. # 在这里改变查找元素的行为
  56. if self.iframe_env:
  57. super().switch_to.default_content()
  58. self.iframe_env = False
  59. if iframe:
  60. # 获取所有的 iframe
  61. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  62. find_element = False
  63. # 遍历所有的 iframe 并点击里面的元素
  64. for iframe in iframes:
  65. # 切换到 iframe
  66. try:
  67. super().switch_to.default_content()
  68. super().switch_to.frame(iframe)
  69. self.iframe_env = True
  70. # 在 iframe 中查找并点击元素
  71. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  72. elements = super().find_elements(by=by, value=value)
  73. if len(elements) > 0:
  74. find_element = True
  75. # 完成操作后切回主文档
  76. # super().switch_to.default_content()
  77. if find_element:
  78. return elements
  79. except:
  80. print("No such element found in the iframe")
  81. if not find_element:
  82. raise NoSuchElementException
  83. else:
  84. return super().find_elements(by=by, value=value)
  85. import sys
  86. if sys.platform != "darwin": # MacOS不支持Cloudflare
  87. ES = 1
  88. if ES == 1:
  89. import undetected_chromedriver as uc
  90. else:
  91. import undetected_chromedriver as uc
  92. class MyUCChrome(uc.Chrome):
  93. def __init__(self, *args, **kwargs):
  94. self.iframe_env = False # 现在的环境是root还是iframe
  95. super().__init__(*args, **kwargs) # 调用父类的 __init__
  96. def find_element(self, by=By.ID, value=None, iframe=False):
  97. # 在这里改变查找元素的行为
  98. if self.iframe_env:
  99. super().switch_to.default_content()
  100. self.iframe_env = False
  101. if iframe:
  102. # 获取所有的 iframe
  103. try:
  104. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  105. except Exception as e:
  106. print(e)
  107. find_element = False
  108. # 遍历所有的 iframe 并点击里面的元素
  109. for iframe in iframes:
  110. # 切换到 iframe
  111. super().switch_to.default_content()
  112. super().switch_to.frame(iframe)
  113. self.iframe_env = True
  114. try:
  115. # 在 iframe 中查找并点击元素
  116. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  117. element = super().find_element(by=by, value=value)
  118. find_element = True
  119. except:
  120. print("No such element found in the iframe")
  121. # 完成操作后切回主文档
  122. # super().switch_to.default_content()
  123. if find_element:
  124. return element
  125. if not find_element:
  126. raise NoSuchElementException
  127. else:
  128. return super().find_element(by=by, value=value)
  129. def find_elements(self, by=By.ID, value=None, iframe=False):
  130. # 在这里改变查找元素的行为
  131. if self.iframe_env:
  132. super().switch_to.default_content()
  133. self.iframe_env = False
  134. if iframe:
  135. # 获取所有的 iframe
  136. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  137. find_element = False
  138. # 遍历所有的 iframe 并点击里面的元素
  139. for iframe in iframes:
  140. # 切换到 iframe
  141. try:
  142. super().switch_to.default_content()
  143. super().switch_to.frame(iframe)
  144. self.iframe_env = True
  145. # 在 iframe 中查找并点击元素
  146. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  147. elements = super().find_elements(by=by, value=value)
  148. if len(elements) > 0:
  149. find_element = True
  150. # 完成操作后切回主文档
  151. # super().switch_to.default_content()
  152. if find_element:
  153. return elements
  154. except:
  155. print("No such element found in the iframe")
  156. if not find_element:
  157. raise NoSuchElementException
  158. else:
  159. return super().find_elements(by=by, value=value)