Selenium Webdriver:如何使用 xPath 单击 IMG 元素

问题描述 投票:0回答:1
python selenium-webdriver
1个回答
0
投票

您的第一个 XPath 不正确。它以“//svg”结尾,与您所说的要在问题中单击的元素不匹配。这可能是它不起作用的原因之一,但根据您提供的有限信息很难判断。

一些建议...

  1. 请勿使用

    time.sleep()
    。它被认为是“愚蠢”的等待,因为它总是等待相同的时间......如果元素提前准备好,它仍然等待 X 秒。如果元素尚未准备好,它就会停止等待。而是使用
    WebDriverWait
    。尤其不需要等待一秒钟,然后使用
    WebDriverWait
    。如果等待时间不够长,则在移除睡眠后在
    WebDriverWait
    超时时间上添加一秒。

  2. WebDriverWait
    .until() 返回等待的元素,例如

    wait = WebDriverWait(driver, 10)
    e = wait.until(EC.element_to_be_clickable(...))
    

    wait.until(EC.element_to_be_clickable(...)).click()
    
  3. 不要捕获您不会处理的异常。现在,您正在捕获三种异常类型,但不对它们执行任何操作,这意味着如果抛出其中一个异常,您的脚本将吞噬它们并继续前进,这将导致脚本中的下一行由于某种未知原因而失败。

  4. 有点挑剔,但命名很重要……根据方法的用途来命名它们。 IMO,

    press_button()
    应该是
    click_button()
    或更好,
    click_element()
    ,因为它是单击(这就是Selenium所说的动作)传入的任何元素,而不仅仅是BUTTON HTML标签。

  5. 不要传入 XPath 字符串作为参数。它限制您的方法只能使用 XPath。相反,传入

    By
    定位器...然后您可以使用
    By.ID()
    By.CSS_SELECTOR()
    ,等等使您的方法更加灵活,例如

  6. 根据您要对元素执行的操作,使用正确的

    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"))
© www.soinside.com 2019 - 2024. All rights reserved.