Selenium - 多个锚点 - 相同ID - 无法获取

时间:2017-04-14 11:11:11

标签: selenium selenium-webdriver

我想点击其标识为clsArrowClick的锚标记,同一个标识位于另一个锚标记上。

<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>

我尝试了list,wait方法和简单的方法,但是我的程序抛出错误 线程“main”中的异常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]”))上单击();

4 个答案:

答案 0 :(得分:0)

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

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

或者这个

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

或如果您对点击第一个链接感兴趣

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

答案 1 :(得分:0)

在您的代码中,您在找到元素之前使用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();

答案 2 :(得分:0)

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;

答案 3 :(得分:-1)

如alessandro-da-rugna所述,id应该是唯一的,我认为它应该是固定的。 Selenium在find元素方面也有局限性,如果有两个或两个以上的元素,它会选择第一个存在的元素,无论它是否可见,哪个click方法都要求元素可见并启用

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

  1. 确保您的xpath是唯一的,因此当您找到元素
  2. 时,您将获得//a[::following-sibling/input[@id='hdnIsSaved1']]
  3. 正如jayesh Doolani所提到的,你可以使用

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

  4. 第二种方法是使用find元素,然后通过检查enable方法,通过检查其属性来确定符合条件的元素,并确保元素可单击。然后单击符合条件的元素