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.

165 lines
6.9 KiB

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 undetected_chromedriver_ES as uc
  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. class MyUCChrome(uc.Chrome):
  87. def __init__(self, *args, **kwargs):
  88. self.iframe_env = False # 现在的环境是root还是iframe
  89. super().__init__(*args, **kwargs) # 调用父类的 __init__
  90. def find_element(self, by=By.ID, value=None, iframe=False):
  91. # 在这里改变查找元素的行为
  92. if self.iframe_env:
  93. super().switch_to.default_content()
  94. self.iframe_env = False
  95. if iframe:
  96. # 获取所有的 iframe
  97. try:
  98. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  99. except Exception as e:
  100. print(e)
  101. find_element = False
  102. # 遍历所有的 iframe 并点击里面的元素
  103. for iframe in iframes:
  104. # 切换到 iframe
  105. super().switch_to.default_content()
  106. super().switch_to.frame(iframe)
  107. self.iframe_env = True
  108. try:
  109. # 在 iframe 中查找并点击元素
  110. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  111. element = super().find_element(by=by, value=value)
  112. find_element = True
  113. except:
  114. print("No such element found in the iframe")
  115. # 完成操作后切回主文档
  116. # super().switch_to.default_content()
  117. if find_element:
  118. return element
  119. if not find_element:
  120. raise NoSuchElementException
  121. else:
  122. return super().find_element(by=by, value=value)
  123. def find_elements(self, by=By.ID, value=None, iframe=False):
  124. # 在这里改变查找元素的行为
  125. if self.iframe_env:
  126. super().switch_to.default_content()
  127. self.iframe_env = False
  128. if iframe:
  129. # 获取所有的 iframe
  130. iframes = super().find_elements(By.CSS_SELECTOR, "iframe")
  131. find_element = False
  132. # 遍历所有的 iframe 并点击里面的元素
  133. for iframe in iframes:
  134. # 切换到 iframe
  135. try:
  136. super().switch_to.default_content()
  137. super().switch_to.frame(iframe)
  138. self.iframe_env = True
  139. # 在 iframe 中查找并点击元素
  140. # 在这个例子中,我们查找 XPath 为 '//div[1]' 的元素
  141. elements = super().find_elements(by=by, value=value)
  142. if len(elements) > 0:
  143. find_element = True
  144. # 完成操作后切回主文档
  145. # super().switch_to.default_content()
  146. if find_element:
  147. return elements
  148. except:
  149. print("No such element found in the iframe")
  150. if not find_element:
  151. raise NoSuchElementException
  152. else:
  153. return super().find_elements(by=by, value=value)