您的第一个 XPath 不正确。它以“//svg”结尾,与您所说的要在问题中单击的元素不匹配。这可能是它不起作用的原因之一,但根据您提供的有限信息很难判断。
一些建议...
请勿使用
time.sleep()
。它被认为是“愚蠢”的等待,因为它总是等待相同的时间......如果元素提前准备好,它仍然等待 X 秒。如果元素尚未准备好,它就会停止等待。而是使用 WebDriverWait
。尤其不需要等待一秒钟,然后使用 WebDriverWait
。如果等待时间不够长,则在移除睡眠后在 WebDriverWait
超时时间上添加一秒。
WebDriverWait
.until() 返回等待的元素,例如
wait = WebDriverWait(driver, 10)
e = wait.until(EC.element_to_be_clickable(...))
或
wait.until(EC.element_to_be_clickable(...)).click()
不要捕获您不会处理的异常。现在,您正在捕获三种异常类型,但不对它们执行任何操作,这意味着如果抛出其中一个异常,您的脚本将吞噬它们并继续前进,这将导致脚本中的下一行由于某种未知原因而失败。
有点挑剔,但命名很重要……根据方法的用途来命名它们。 IMO,
press_button()
应该是click_button()
或更好,click_element()
,因为它是单击(这就是Selenium所说的动作)传入的任何元素,而不仅仅是BUTTON HTML标签。
不要传入 XPath 字符串作为参数。它限制您的方法只能使用 XPath。相反,传入
By
定位器...然后您可以使用 By.ID()
,
By.CSS_SELECTOR()
,等等使您的方法更加灵活,例如
根据您要对元素执行的操作,使用正确的
EC
方法。如果要单击某个元素,请使用 EC.element_to_be_clickable()
。如果您打算以其他方式与该元素交互,例如使用 .text
或 .send_keys()
,然后使用 EC.visibility_of_element_located()
。
考虑到这一切,您的方法可以简化为
def click_element(locator):
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(locator)).click()
并且可以使用
调用click_element((By.ID, "ButtonClose"))