【问题标题】:Selenium - Multiple anchor - Same ID - Not able to fetchSelenium - 多个锚点 - 相同的 ID - 无法获取
【发布时间】:2017-09-10 15:28:45
【问题描述】:

我想点击类 id 为 clsArrowClick 的锚标签,而另一个锚标签上有相同的 id。

<td class="text-center" style="width: 25% !important;">
<td class="arrow" data-toggle="tooltip" data-container="body" title="" 
style="width: 25% !important; text-align:center" data-original-
title="Select/Show Data">
**<a id="clsArrowClick" class="clsarrowClick" href="#" 
onclick="javascript:OpenAddNewWellPopup(this);">
<i class="fa fa-arrow-right"/>
</a>**
<input id="hdnIsSaved0" class="hdnIsArrowSaved" value="0" type="hidden"/>
</td>
</tr>
<tr id="2">
<td style="width:50%; class=" '="" data-container="body" data-
toggle="tooltip" title="" data-original-title="abcd">abcd</td>
<td class="text-center" style="width: 25% !important;">
<td class="arrow" data-toggle="tooltip" data-container="body" title=""             
style="width: 25% !important; text-align:center" data-original-            
title="Select/Show Data">
**<a id="clsArrowClick" class="clsarrowClick" href="#" 
onclick="javascript:OpenAddNewPopup(this);">
<i class="fa fa-arrow-right"/>
</a>**
<input id="hdnIsSaved1" class="hdnIsArrowSaved" value="0" type="hidden"/>
</td>

我尝试了列表、等待方法和简单方法,但我的程序抛出错误 线程“主”org.openqa.selenium.ElementNotVisibleException 中的异常

喜欢

//WebDriverWait wait = new WebDriverWait(driver,30); //wait.until(ExpectedConditions.presenceOfElementLocated(By.className("clsArrowClick"))); //driver.findElement(By.className("clsarrowClick")); driver.findElement(By.xpath("(.//*[@id='clsArrowClick'])[1]")).click();

【问题讨论】:

  • 1.我观察到有 2 个链接 id="clsArrowClick" & class="clsarrowClick"。其中一个调用 JavaScript "OpenAddNewWellPopup(this)" 而另一个调用 JavaScript "OpenAddNewPopup(this)" 那么你想点击哪一个? 2. 可以多粘贴一点HTML DOM吗? 3. 请保持您的 HTML DOM 格式,以便我们更容易理解。
  • 我想点击第一个,这就是我能提供的所有 HTML
  • 当你使用 findElement 时,你将返回第一个元素,不需要在 xpath 中使用索引。您应该使用 visibilityofelementlocated() 预期条件。
  • 与问题没有直接关系,但要求开发人员FIX THE HTMLids 应该是唯一的

标签: selenium selenium-webdriver


【解决方案1】:

尝试以下 xpaths 可能适用于第二个链接。我没有测试过,我不知道你页面的整个 html,所以我说可能。

//a[@id='clsArrowClick'][2]

还是这个

//input[@id='hdnIsSaved1']../a[@id='clsArrowClick']

如果您有兴趣点击第一个链接,请关注

//td[@class='arrow']/a[@id='clsArrowClick']

【讨论】:

    【解决方案2】:

    在您的代码中,您在查找元素之前使用了presenceOfElementLocated 条件。需要注意的重要一点是presenceOfElementLocated 仅检查 DOM 上是否存在元素,而不管它的可见性如何。你需要确保你获取的元素是可见的,所以你应该使用ExpectedConditions.visibilityOfElementLocatedvisibilityOfElementLocated 保证该元素在 DOM 上可用并且可见,因此这将有助于克服您所面临的 org.openqa.selenium.ElementNotVisibleException

    所以你的代码应该是这样的:

    WebDriverWait wait = new WebDriverWait(driver,30); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(
               By.xpath("(.//*[@id='clsArrowClick'])[1]"))); 
    driver.findElement(By.xpath("(.//*[@id='clsArrowClick'])[1]")); //this step can be skipped
    driver.findElement(By.xpath("(.//*[@id='clsArrowClick'])[1]")).click();
    

    【讨论】:

      【解决方案3】:

      正如 alessandro-da-rugna 所说,id 应该是唯一的,我认为它应该是固定的。 Selenium 在查找元素方面也有限制,如果有两个或多个元素,它会选择第一个出现的,不管它是否可见,哪种点击方法需要元素可见并启用

      要解决这个问题,有几种方法

      1. 确保您的 xpath 是唯一的,以便在找到元素时获得,例如 //a[::following-sibling/input[@id='hdnIsSaved1']]
      2. 正如 jayesh Doolani 所说,您可以使用

        WebElement myElement = wait.until(ExpectedConditions.elementToBeClickable(By.xpath()) myElement.click()

      3. 第二种方法是使用查找元素,然后通过检查其属性找到符合条件的元素,并通过检查启用方法确保元素可点击。然后点击符合您条件的元素

      【讨论】:

        【解决方案4】:
        element = driver.findElement(By.xpath("html/body/div[9]/div/div/div[3]/button[2]"));
                 js = (JavascriptExecutor)driver; 
                 js.executeScript("arguments[0].click();", element);
                 element = null;
                 js = null;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-14
          • 2015-03-26
          • 1970-01-01
          • 1970-01-01
          • 2021-05-02
          • 2015-10-07
          • 2015-09-24
          相关资源
          最近更新 更多