Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium-多个锚点-相同ID-无法获取_Selenium_Selenium Webdriver - Fatal编程技术网

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

Selenium-多个锚点-相同ID-无法获取,selenium,selenium-webdriver,Selenium,Selenium Webdriver,我想单击类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- titl

我想单击类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>

****

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

//a[@id='clsArrowClick'][2]
还是这个

//input[@id='hdnIsSaved1']../a[@id='clsArrowClick']
或者,如果您对单击第一个链接感兴趣,请单击下面的链接

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

在代码中,在查找元素之前,您使用的是
presenceOfElementLocated
条件。需要注意的一点是,
presenceOfElementLocated
只检查DOM上是否存在元素,而不管元素的可见性如何。您需要确保要获取的元素是可见的,因此为此,您应该使用
ExpectedConditions.visibilityOfElementLocated
ElementLocated的可见性
保证元素在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();

正如alessandro da rugna提到的,id应该是唯一的,我认为它应该是固定的。Selenium在find元素方面也有限制,如果有两个或更多元素,它将选择出现的第一个元素,不管它是否可见,单击方法要求元素可见并启用

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

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

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

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


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