【问题标题】:Click on hyperlink using Selenium Webdriver使用 Selenium Webdriver 单击超链接
【发布时间】:2013-10-04 08:15:18
【问题描述】:

我在尝试使用 Selenium Webdriver 单击超链接时遇到问题。我尝试使用 CssSelector 以及 XPath,但似乎没有任何效果。我要做的就是点击谷歌文本。

    <div class="hello">
    <div class="test">
    <table class="first first-table">
    <tbody>
    <tr>
    <td class="second-table">
    <a id="dummyID" href="https://www.google.com" target="_blank">Google</a>
   </td>
   </tr>
  </tbody>
  </table>`

我试过 driver.FindElement(By.XPath("//*[@id='dummyID']")).Click();我还尝试使用 href 来查找链接...几乎所有内容。一直以来,我都遇到“无法找到元素”异常。有人有什么建议吗?

【问题讨论】:

  • 链接是否包含在框架或 iframe 中?
  • @Richard 这是个好问题..
  • 使用 Firebug 查看 HTML,我没有看到任何 frame/iframe。
  • 我认为此时,我们将需要查看更多 html,可能还需要查看从初始化驱动程序到您尝试单击链接的代码。
  • 如果有帮助试试这个stackoverflow.com/questions/13040719/…

标签: xpath selenium


【解决方案1】:

试试这个:

driver.FindElement(By.LinkText("Google")).Click();

查看元素是否在框架或 iframe 中。如果是,您需要使用:

driver.SwitchTo().Frame("frameID");

【讨论】:

  • 那么driver.FindElement(By.XPath("//*[@id='dummyID']")).Click()这里有什么问题?
  • 它没有框架..至少页面源没有显示任何框架。
  • @user1493537 afaik,页面源中可能不存在框架。在您的 Firebug 中,定位器输入的左侧有一个下拉菜单。它显示了什么?
  • 是的,我查过了,没有框架。
【解决方案2】:

你可以使用

driver.FindElement(By.LinkText("Google")).Click();

【讨论】:

    【解决方案3】:

    您可以通过id轻松找到:

    driver.FindElement(By.id("dummyID")).Click();
    

    或者你可以在你的场景中使用这个 xpath:

    driver.FindElement(By.XPath("//a[@id='dummyID']")).Click();
    

    您可以直接通过 id 找到元素,这是一种简单高效的方法。 我希望你能通过任何这些代码片段获得你想要的点击,两者应该是一样的。肯定会成功的。

    【讨论】:

      【解决方案4】:

      没有一个建议的解决方案每次都能奏效。超链接不能像按钮等其他可点击的 Web 元素一样对待。通过从锚标记中删除 href 属性来禁用超链接。对于其他组件,Web 驱动程序可以询问找到的 Web 元素以查看是否已启用或可单击。考虑以下场景:

      <a id="dummyID" target="_blank">Google</a>
      
      WebElement element = new WebDriverWait(driver, 1).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Google']")));
      element.click();
      

      因为ExpectedConditions 类不能像对输入元素(例如按钮)那样确定链接的“可点击性”,所以它不会抛出TimeoutException 并允许您的测试点击死(禁用)链接。因此,对于专门的超链接,您必须要么搜索其中包含href 属性的锚标记,要么测试点击的结果(即 URL 的更改)。

      您应该尽量避免的另一件事是使用//* 来定位网络元素。您可能会遇到一种情况,即会找到多个元素,最终会与不正确的元素进行交互。

      最后,driver.FindElement(...) 的问题在于,如果页面没有完全加载,您可能会遇到NoSuchElement 异常问题(除非您设置了某种隐式等待)。等待元素与之交互的首选方式是使用显式等待,就像我上面提供的 Java 示例一样。由于我不知道您遇到了什么问题,因此我不得不假设这可能是您的问题。如果这不是问题,则可能元素位于 iframe 内,在这种情况下,您需要告诉 Web 驱动程序在与元素交互之前切换到正确的 iframe

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多