You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
7.5 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  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:
  46. print("No such element found in the iframe")
  47. # 完成操作后切回主文档
  48. # super().switch_to.default_content()
  49. if find_element:
  50. return element
  51. if not find_element:
  52. raise NoSuchElementException
  53. else:
  54. return super().find_element(by=by, value=value)
  55. def find_elements(self, by=By.ID, value=None, iframe=False):
  56. # 在这里改变查找元素的行为
  57. if self.iframe_env:
  58. super().switch_to.default_content()
  59. self.iframe_env = False
  60. if iframe:
  61. # 获取所有的 iframe
  62. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  63. find_element = False
  64. # 遍历所有的 iframe 并点击里面的元素
  65. for iframe in iframes:
  66. # 切换到 iframe
  67. try:
  68. super().switch_to.default_content()
  69. super().switch_to.frame(iframe)
  70. self.iframe_env = True
  71. # 在 iframe 中查找并点击元素
  72. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  73. elements = super().find_elements(by=by, value=value)
  74. if len(elements) > 0:
  75. find_element = True
  76. # 完成操作后切回主文档
  77. # super().switch_to.default_content()
  78. if find_element:
  79. return elements
  80. except:
  81. print("No such element found in the iframe")
  82. if not find_element:
  83. raise NoSuchElementException
  84. else:
  85. return super().find_elements(by=by, value=value)
  86. # MacOS不支持直接打包带Cloudflare的功能,如果要自己编译运行,可以把这个if去掉,然后配置好浏览器和driver路径
  87. if sys.platform != "darwin":
  88. ES = True
  89. if ES: # 用自己写的ES版本
  90. import undetected_chromedriver_ES as uc
  91. else:
  92. import undetected_chromedriver as uc
  93. class MyUCChrome(uc.Chrome):
  94. def __init__(self, *args, **kwargs):
  95. self.iframe_env = False # 现在的环境是root还是iframe
  96. super().__init__(*args, **kwargs) # 调用父类的 __init__
  97. def find_element(self, by=By.ID, value=None, iframe=False):
  98. # 在这里改变查找元素的行为
  99. if self.iframe_env:
  100. super().switch_to.default_content()
  101. self.iframe_env = False
  102. if iframe:
  103. # 获取所有的 iframe
  104. try:
  105. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  106. except Exception as e:
  107. print(e)
  108. find_element = False
  109. # 遍历所有的 iframe 并点击里面的元素
  110. for iframe in iframes:
  111. # 切换到 iframe
  112. super().switch_to.default_content()
  113. super().switch_to.frame(iframe)
  114. self.iframe_env = True
  115. try:
  116. # 在 iframe 中查找并点击元素
  117. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  118. element = super().find_element(by=by, value=value)
  119. find_element = True
  120. except:
  121. print("No such element found in the iframe")
  122. # 完成操作后切回主文档
  123. # super().switch_to.default_content()
  124. if find_element:
  125. return element
  126. if not find_element:
  127. raise NoSuchElementException
  128. else:
  129. return super().find_element(by=by, value=value)
  130. def find_elements(self, by=By.ID, value=None, iframe=False):
  131. # 在这里改变查找元素的行为
  132. if self.iframe_env:
  133. super().switch_to.default_content()
  134. self.iframe_env = False
  135. if iframe:
  136. # 获取所有的 iframe
  137. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  138. find_element = False
  139. # 遍历所有的 iframe 并点击里面的元素
  140. for iframe in iframes:
  141. # 切换到 iframe
  142. try:
  143. super().switch_to.default_content()
  144. super().switch_to.frame(iframe)
  145. self.iframe_env = True
  146. # 在 iframe 中查找并点击元素
  147. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  148. elements = super().find_elements(by=by, value=value)
  149. if len(elements) > 0:
  150. find_element = True
  151. # 完成操作后切回主文档
  152. # super().switch_to.default_content()
  153. if find_element:
  154. return elements
  155. except:
  156. print("No such element found in the iframe")
  157. if not find_element:
  158. raise NoSuchElementException
  159. else:
  160. return super().find_elements(by=by, value=value)