问题是,您将上下文切换到IFRAME,但从未从该上下文返回。Selenium正在IFRAME中寻找cookie面板关闭按钮。要将上下文返回到整页,您需要使用
driver.switch_to.default_content()
.
其他建议:
-
避免
time.sleep()
。它们会使你的脚本变慢,而且不像
WebDriverWait
.
-
使用
WebDriverWait
一贯地您应该对每个元素交互使用等待/
.find_element()
呼叫如果要单击元素,请使用
EC.element_to_be_clickable()
。如果您要以其他方式与元素交互(获取
.text
,等等,使用
EC.visibility_of_element_located()
回顾
the docs
了解更多等待类型和其他信息。
-
你导航了两次。。。首先是谷歌,然后是UPS网站。您只需要导航一次。
-
保持进口清洁。您导入了两个不同的实例
WebDriverWait
以及一堆你没有使用的其他进口产品。在编码时,将导入列表缩减为仅必要的内容可以减少代码和混乱。
-
你应该更喜欢
By.ID()
和
By.CSS_SELECTOR()
到XPaths。ID是页面上最简单、最不可能更改的。CSS选择器比XPaths更快,语法更简单。
考虑到所有这些,我将您的代码简化为下面的工作代码,
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
url = 'https://www.ups.com/track?track=yes&trackNums=1Z12345E1512345676&loc=en_US&requester=ST/'
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
wait = WebDriverWait(driver, 5)
# switch to chat IFRAME and close chat
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "inqChatStage")))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[aria-label='End Chat']"))).click()
driver.switch_to.default_content()
# close cookies panel
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.implicit_consent span.ups-icon-x"))).click()
driver.quit()