查找具有完全相同属性的元素

时间:2015-10-28 15:12:54

标签: java eclipse selenium xpath

我正在使用selenium webdriver和java在Eclipse中创建一个测试。我有一个页面,我想点击一个包含以下代码的按钮:

<button type="button" id="ext-gen1078" class="x-btn-text">Add</button>

问题是这个完全相同的行(除了id)在代码的前面使用,所以当我使用下面的代码行时,它会点击第一个项目,而我想点击一个下一个代码页。

driver.findElement(By.xpath("//button[@class='x-btn-text' and text()='Add']")).click();

我不能使用ID,因为ID是自动生成的(屁股很痛),所以没有唯一的标识符。我尝试使用完整的Xpath作为第二个按钮,但这不起作用,只是太久了。

有没有办法确定这段确切的代码行(除了ID之外的确切代码)存在多少次,然后选择第二行甚至第三行(如果有多于两行?)

======================================

基于@drkthng提供的以下答案,我已经更新了这个问题。这是工作代码:

List<WebElement> listOfElements = driver.findElements(By.xpath("//*[@class=' x-btn-text' and text()='Add']"));
System.out.println("There are "+listOfElements.size()+" buttons with the text 'Add'");

if(listOfElements.size() >= 2) {
  listOfElements.get(1).click();
}

这会导致单击正确的按钮和打印: 有2个按钮,文本为“添加”

3 个答案:

答案 0 :(得分:1)

如果直接通过xpath搜索第二个按钮:

driver.findElement(By.xpath("//button[@class='x-btn-text' and text()='Add'][2]")).click();

或者既然你问过,你也可以通过元素列表来实现

  

有没有办法确定这段确切代码行的次数   (确切的除了ID)存在

List<WebElement> listOfElements = driver.findElements(By.xpath("//button[@class='x-btn-text' and text()='Add']");

if(listOfElements.size() >= 2) {
  listOfElements.get(1).click();
}

*如果您使用xpath进行索引,则索引从1开始。在第二种方法中,索引从0开始!

答案 1 :(得分:0)

不知道为什么,但我似乎无法将此图片添加到原始帖子

enter image description here

答案 2 :(得分:0)

我仍然不知道在我实施drkthng的解决方案和现在使用的内容之间有什么区别,但是它正在运行! (这就是我所需要的)。 这是工作代码:

List<WebElement> listOfElements = driver.findElements(By.xpath("//*[@class=' x-btn-text' and text()='Add']"));
System.out.println("There are "+listOfElements.size()+" buttons with the text 'Add'");

if(listOfElements.size() >= 2) {
  listOfElements.get(1).click();
}

这会导致单击正确的按钮和打印: 有2个按钮,其中包含文字&#39;添加&#39;

原始问题对话:太长,但不想浪费它

我使用selenium webdriver和java在Eclipse中创建测试。我有一个页面,我想点击一个包含以下代码的按钮:

<button type="button" id="ext-gen1078" class="x-btn-text">Add</button>

问题是这个完全相同的行(除了id)在代码的前面使用,所以当我使用下面的代码行时,它会点击第一个项目,而我想点击一个是进一步沿着代码页。

driver.findElement(By.xpath("//button[@class='x-btn-text' and text()='Add']")).click();

我无法使用ID作为ID&#34; s是自动生成的(对接中的痛苦),因此没有唯一标识符。我尝试使用完整的Xpath作为第二个按钮,但这不起作用,只是太长了。

有没有办法确定这段确切的代码行(除了ID之外的确切代码)存在多少次,然后选择第二行甚至第三行(如果有多于两行?)

======================================

根据@drkthng提供的以下答案,我已经更新了问题。使用以下代码的建议导致了NoSuchElementException:无法找到元素&#39;。我尝试将2更改为[3]或[4]以检查是否存在更多实例,但这些实例导致了相同的错误。

 driver.findElement(By.xpath("//button[@class=' x-btn-text' and text()='Add'][2]")).click();

然后我尝试了第二个选项,但是当这个不起作用时,我添加了一个打印命令来查看定义为ListOfElements的内容

List<WebElement> listOfElements = driver.findElements(By.xpath("//button[@class=' x-btn-text' and text()='Toevoegen']"));
System.out.println("test"+listOfElements); /** I added this bit */
if(listOfElements.size() >= 2) {
  listOfElements.get(1).click();
}

它仍然没有点击按钮并打印以下内容

test[[[FirefoxDriver: firefox on WINDOWS (b5689768-xxxx-xxxx-xxxx-f92cc3c41d33)] -> xpath: //button[@class=' x-btn-text' and text()='Add']]]

如果我将.get(1)更改为.get(0)以便单击第一个按钮仍然没有任何反应。

======================================

不确定这是否有帮助,但这是第一个按钮的代码行

<button type="button" id="ext-gen235" class="x-btn-text">Add</button> 

这是完整的Xpath

/html/body/div[19]/div[2]/div[1]/div/div/div/div/div/div/div[2]/div[2]/div[1]/div/table/tbody/tr/td[1]/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]/em/button

这是第二个按钮(我想点击的按钮)的代码

<button type="button" id="ext-gen558" class="x-btn-text">Add</button>

这是它的完整Xpath

/html/body/div[35]/div[2]/div[1]/div/div/div/div/div[2]/div/div/div/div[1]/div/table/tbody/tr/td[1]/table/tbody/tr/td[1]/table/tbody/tr[2]/td[2]/em/button

======================================

更多信息:

好的,我使用以下脚本:

/** I start of in the Main application window and This bit opens the first popup */
driver.findElement(By.xpath("xpath menu")).click();
driver.findElement(By.xpath("//span[@class='x-menu-item-text' and text()='Popup 1']")).click();

/** The first popup is open. I then select an option in a dropdown an click search */ 
wait.until(ExpectedConditions.elementToBeClickable(By.id("searchRoleFieldId")));
driver.findElement(By.id("searchRoleFieldId")).click();
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='x-combo-list-item' and text()='Option 1']")));
driver.findElement(By.xpath("//div[@class='x-combo-list-item' and text()='Option 1']")).click();
driver.findElement(By.xpath("//button[@class=' x-btn-text' and text()='search']")).click();

/** I then select one of the search results and click the Edit button, this results in popup 2 being opened (edit window) */
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='x-grid3-cell-inner x-grid3-col-2' and text()='Result1']")));
driver.findElement(By.xpath("//div[@class='x-grid3-cell-inner x-grid3-col-2' and text()='Result 1']")).click();
driver.findElement(By.xpath("//button[@class=' x-btn-text' and text()='Edit']")).click();

/** The second popup is open. I don't need to do anything in this screen other then to click a button (address) to view which addresses are linked to this Option 1. Clickin the addres button opens popup 3 */
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class=' x-btn-text' and text()='Address']")));
driver.findElement(By.xpath("//button[@class=' x-btn-text' and text()='Address']")).click();

/** The third popup is open. Now in this window I can see which addresses are available for Option 1. I would like to add an address by clicking the add button */
driver.findElement(By.xpath("//button[@class=' x-btn-text' and text()='Toevoegen'][2]")).click(); /** this does nothing  but when I remove the [2] bit the edit button on the first popup is click and opens a window to add a new Result*/

List<WebElement> listOfElements = driver.findElements(By.xpath("//button[@class=' x-btn-text' and text()='Toevoegen']"));
System.out.println("number of hits = "+listOfElements.size());
if(listOfElements.size() >= 2) {
  listOfElements.get(0).click();
}

enter image description here enter image description here