我正在使用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个按钮,文本为“添加”
答案 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)
答案 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();
}