【问题标题】:How to locate the element correctly to click on href element in python如何正确定位元素以单击python中的href元素
【发布时间】:2019-08-19 17:46:33
【问题描述】:

如何编写 xpath 以便我可以在 python 中单击带有 selenium 的设置按钮以获取以下 html。由于设置元素没有自己的 ID,因此单击该元素变得更加困难。

<ul class="nav nav-tabs">
    <li class="active">
        <a data-toggle="tab" href="#editor">Structure</a>
    </li>
    <li>
        <a data-toggle="tab" href="#feedback">Feedback</a>
    </li>
    <li>
        <a data-toggle="tab" href="#settings">General settings</a>
    </li>

我尝试了多个命令,但似乎都没有正确。

我正在使用元素(复数),以便我可以查看它是否与任何 xpath 匹配。认为这将是测试不同 xpath 的最干净的方法。如果我正确获得了 xpath,我将使用元素(单数)并将 .click() 添加到末尾。我至少尝试了以下这些代码。

  1. driver.find_elements_by_xpath("//*[@class='nav nav-tabs']//*[href='#settings']") --> return [] (xpath 不匹配?)

  2. driver.find_elements_by_xpath("//ul[contains(@class, 'nav-tabs')]") --> 返回 []

  3. driver.find_elements_by_xpath(".//a[@href='#settings']") --> 返回 []

当我“点击”该元素时,它通常会给出以下错误消息:

NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":".//a[@href='#settings']"}

【问题讨论】:

  • 你试过 CSS 选择器吗?
  • driver.find_element_by_css_selector("a[href='#settings']").click() 返回 NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"a[href='#settings']"}你对我可以尝试什么有什么建议吗?
  • 尝试使用WebDriverWait查看我编辑的答案

标签: python-3.x selenium xpath css-selectors webdriverwait


【解决方案1】:

@MosheSlavin 很接近。但是,要在元素上使用 click(),您必须为 element_to_be_clickable() 诱导 WebDriverWait,并且您可以使用以下任一 Locator Strategies

  • 使用LINK_TEXT

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "General settings"))).click()
    
  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "ul.nav.nav-tabs li>a[href$='settings']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@class='nav nav-tabs']//li/a[text()='General settings']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

在这里你可以找到关于Selenium “selenium.common.exceptions.NoSuchElementException” when using Chrome的详细讨论

【讨论】:

  • 问题原来是,不是元素没有加载,而是硒在错误的帧中寻找元素。您提供的链接帮助我找到了解决问题所需的信息。所以非常感谢你!因此解决方案是找到正确的 iframe id 并将其插入此函数 driver.switch_to.frame("iframe_name") 中。之后,我运行了 driver.find_element_by_xpath(".//a[@href='#settings']").click() 并且它起作用了。 :)
  • @TomasStorås 不仅是你,每个从 Selenium 开始的人都必须跨越这些阶段,所以在回答时我总是将 新贡献者 指向我很久以前发表的详细答案。很高兴能为您提供帮助。
  • 这是一个示例,说明为什么在问题中显示完整的 HTML/URL 是个好主意。
【解决方案2】:

该元素可能尚未加载,因此请使用WebDriverWait 等待该元素:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href='#settings']")))

或者

WebDriverWait(self.driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href='#settings']")))

【讨论】:

  • 感谢您的回复。我还没有定义一个类,所以我想我不应该在代码中包含 self(?)。好吧,我这样运行它: WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href='#settings']"))) 它返回: raise TimeoutException(message, screen, stacktrace) TimeoutException 我不认为问题在于元素尚未加载。由于我打开了网页并继续运行不同的命令,所以该元素肯定已经加载。莫非它是不可见的(!?)。
【解决方案3】:

解决方案是 selenium 在错误的帧中寻找元素。我检查了 html 代码,发现了两个 iframe id。我在这个函数中插入了一个 iframe id

driver.switch_to.frame("iframe_name") 

然后

driver.find_element_by_xpath(".//a[@href='#settings']").click()

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多