2在页面中放置相同的XPath

时间:2017-12-31 09:48:23

标签: selenium xpath

我想将文本插入文件中。此文件xpath = "//*[@id='email']"。 此XPath将移动到网页中的2个位置。第一个是不可见的,第二个是OK。我想在第二个插入文本。我是这样做的:

String xpathOfElement = "//*[@id='email']";

List<WebElement> a = driver.findElements(By.xpath(xpathOfElement));
a.get(1).sendKeys("hhh");

我收到了以下错误消息:

  

java.lang.IndexOutOfBoundsException:Index:1,Size:1

2 个答案:

答案 0 :(得分:0)

@libi是的,如果你能提供url我可以帮你写xpath。您可能需要查看 Xpath Cheat Sheet

我的建议是包含父/兄弟,以使您的xpath 唯一。例如,

<!DOCTYPE html>
<html>
<body>

<div class="email">
  E-mail:
  <input type="email" name="email">
  <input type="submit">
</div>
<br>
<div class="email2">
  E-mail 2:
  <input type="email" name="email2">
  <input type="submit">
</div>

</body>
</html>

电子邮件的Xpath: //div[@class="email"]/input[@type="email"]

电子邮件2的Xpath: //div[@class="email2"]/input[@type="email"]

答案 1 :(得分:0)

根据您在问题中提供的详细信息,您在下面观察到的错误非常正确:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

分析

正如您所提到的This XPath is moved to 2 places in the web page. The first is not visible and the second is OK. I want to insert text to the second.,所以只要您:

String xpathOfElement = "//*[@id='email']";
List<WebElement> a = driver.findElements(By.xpath(xpathOfElement));

只有你提到的第二个元素存储在 List a 中。由于第一个元素不可见 Selenium 无法在 {{中识别出公开 1}} 即可。因此, DOM Tree 将包含一个List<WebElement> a

WebElement

所以,接下来当你尝试:

[[[FirefoxDriver: firefox on XP (52a50170-91f5-4211-ae81-a72f0d863714)] -> xpath: //*[@id='email']]]

a.get(1).sendKeys("hhh"); 是指a.get(1)中的第二个元素,该位置既未初始化也未包含任何值。因此,您看到:

List

解决方案:

简单的解决方案是为可见(java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 )元素构建唯一的逻辑cssxpath。要实现 OK 是不够的。您必须遍历String xpathOfElement = "//*[@id='email']";并找到父节点并构造唯一的DOM并按以下步骤操作:

xpath

另一种方式是您尝试的方式,而不是String unique_xpathOfElement = "//*[@id='email']"; driver.findElement(By.xpath(unique_xpathOfElement)).sendKeys("hhh"); 1 ,您必须 index {{1} } 0 如下:

get()