Selenium:元素没有得到子元素
Selenium: Element not getting child element
我正在做一个 selenium 自动化测试,我得到一个网络元素列表,然后得到每个元素的子元素。但不幸的是,当我这样做时,它只从列表中获取第一个元素的子元素,这很奇怪。谁能指出哪里出了问题?谢谢
@Override
public void performTest() {
performAction();
try {
for (WebElement element : search_rows) {
System.out.println(element.getAttribute("class"));
System.out.println(element);
assertElements(element, Constants.Selectors.AMITY_RESULT_ONE);
assertElements(element, Constants.Selectors.AMITY_RESULT_TWO);
assertElements(element, Constants.Selectors.AMITY_RESULT_THREE);
}
WebElement nextpage = WebDriverUtils.findElementByCssSelector(
driver, Constants.Selectors.AMITY_NEXT_PAGE);
WebDriverUtils.scrollToElement(driver, nextpage,
WebDriverUtils.BY_JAVASCRIPT);
nextpage.click();
performTest();
} catch (Exception e) {
// e.printStackTrace();
}
}
@Override
public void performAction() {
try {
WebElement searchpage = WebDriverUtils.findElementByXpath(driver,
Constants.Selectors.AMITY_SEARCHED_ITEMS);
search_rows = searchpage.findElements(By
.xpath(Constants.Selectors.AMITY_SEARCH_WRAPPER));
} catch (Exception e) {
// e.printStackTrace();
}
}
private void assertElements(WebElement element, String constant) {
search_result = element.findElement(By.xpath(constant));
System.out.println(search_result.getAttribute("class"));
System.out.println(search_result);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_FIRST_CHOICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_FIRST_CHOICE)).getText();
compareText(combo.getBeds(), comparetext);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_SECOND_CHOICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_SECOND_CHOICE)).getText();
compareText(combo.getBaths(), comparetext);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_THIRD_CHOICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_THIRD_CHOICE)).getText();
compareText(combo.getCarparks(), comparetext);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_NAME)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_NAME)).getText();
containsText(combo.getSuburb(), comparetext);
if (combo.getPrice() != null) {
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_PRICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_PRICE)).getText();
if (!comparetext.equals("Contact Agent")) {
comparetext = parsePrice(comparetext);
comparePrice(combo.getPrice().substring(2), comparetext);
}
}
}
常量如下:
public static final String AMITY_SEARCHED_ITEMS = "//div[@class='content-sidebar-wrap']";
public static final String AMITY_SEARCH_WRAPPER = "//div[@class='searches-wrapper']";
public static final String AMITY_RESULT_ONE = "//div[contains(@class, 'searchresultbox1')]";
public static final String AMITY_RESULT_TWO = "//div[contains(@class, 'searchresultbox2')]";
public static final String AMITY_RESULT_THREE = "//div[contains(@class, 'searchresultbox3')]";
public static final String AMITY_FIRST_CHOICE = "(//div[@class='searchinfo']//span)[1]";
public static final String AMITY_SECOND_CHOICE = "(//div[@class='searchinfo']//span)[2]";
public static final String AMITY_THIRD_CHOICE = "(//div[@class='searchinfo']//span)[3]";
public static final String AMITY_NAME = "//p[@class='p-searchname']";
public static final String AMITY_PRICE = "//div[@class='search-wrapp']//div[@class='searchprice']//span[@class='spn-search-price']//span[@class='searchprice']";
public static final String AMITY_NEXT_PAGE = ".pagination-next > a:nth-child(1)";
谢谢。我真的需要尽快解决这个问题
以 //
开头的 XPath 是全局的,即使您从另一个元素的上下文中执行它也是如此。
尝试使用 .//
来将其限制为元素的子元素。
确保:-
您已通过调试代码或在任何网络浏览器的控制台中评估它的选择器,在 search_rows 对象中收集了 WebElements 列表
不隐藏第一个元素之后的元素。
或者,如果子元素共享相同的选择器,而不是遍历 WebElements 列表,只需在选择器中使用数字谓词。
我正在做一个 selenium 自动化测试,我得到一个网络元素列表,然后得到每个元素的子元素。但不幸的是,当我这样做时,它只从列表中获取第一个元素的子元素,这很奇怪。谁能指出哪里出了问题?谢谢
@Override
public void performTest() {
performAction();
try {
for (WebElement element : search_rows) {
System.out.println(element.getAttribute("class"));
System.out.println(element);
assertElements(element, Constants.Selectors.AMITY_RESULT_ONE);
assertElements(element, Constants.Selectors.AMITY_RESULT_TWO);
assertElements(element, Constants.Selectors.AMITY_RESULT_THREE);
}
WebElement nextpage = WebDriverUtils.findElementByCssSelector(
driver, Constants.Selectors.AMITY_NEXT_PAGE);
WebDriverUtils.scrollToElement(driver, nextpage,
WebDriverUtils.BY_JAVASCRIPT);
nextpage.click();
performTest();
} catch (Exception e) {
// e.printStackTrace();
}
}
@Override
public void performAction() {
try {
WebElement searchpage = WebDriverUtils.findElementByXpath(driver,
Constants.Selectors.AMITY_SEARCHED_ITEMS);
search_rows = searchpage.findElements(By
.xpath(Constants.Selectors.AMITY_SEARCH_WRAPPER));
} catch (Exception e) {
// e.printStackTrace();
}
}
private void assertElements(WebElement element, String constant) {
search_result = element.findElement(By.xpath(constant));
System.out.println(search_result.getAttribute("class"));
System.out.println(search_result);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_FIRST_CHOICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_FIRST_CHOICE)).getText();
compareText(combo.getBeds(), comparetext);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_SECOND_CHOICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_SECOND_CHOICE)).getText();
compareText(combo.getBaths(), comparetext);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_THIRD_CHOICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_THIRD_CHOICE)).getText();
compareText(combo.getCarparks(), comparetext);
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_NAME)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_NAME)).getText();
containsText(combo.getSuburb(), comparetext);
if (combo.getPrice() != null) {
System.out.println(search_result.findElement(By
.xpath(Constants.Selectors.AMITY_PRICE)));
comparetext = search_result.findElement(
By.xpath(Constants.Selectors.AMITY_PRICE)).getText();
if (!comparetext.equals("Contact Agent")) {
comparetext = parsePrice(comparetext);
comparePrice(combo.getPrice().substring(2), comparetext);
}
}
}
常量如下:
public static final String AMITY_SEARCHED_ITEMS = "//div[@class='content-sidebar-wrap']";
public static final String AMITY_SEARCH_WRAPPER = "//div[@class='searches-wrapper']";
public static final String AMITY_RESULT_ONE = "//div[contains(@class, 'searchresultbox1')]";
public static final String AMITY_RESULT_TWO = "//div[contains(@class, 'searchresultbox2')]";
public static final String AMITY_RESULT_THREE = "//div[contains(@class, 'searchresultbox3')]";
public static final String AMITY_FIRST_CHOICE = "(//div[@class='searchinfo']//span)[1]";
public static final String AMITY_SECOND_CHOICE = "(//div[@class='searchinfo']//span)[2]";
public static final String AMITY_THIRD_CHOICE = "(//div[@class='searchinfo']//span)[3]";
public static final String AMITY_NAME = "//p[@class='p-searchname']";
public static final String AMITY_PRICE = "//div[@class='search-wrapp']//div[@class='searchprice']//span[@class='spn-search-price']//span[@class='searchprice']";
public static final String AMITY_NEXT_PAGE = ".pagination-next > a:nth-child(1)";
谢谢。我真的需要尽快解决这个问题
以 //
开头的 XPath 是全局的,即使您从另一个元素的上下文中执行它也是如此。
尝试使用 .//
来将其限制为元素的子元素。
确保:-
您已通过调试代码或在任何网络浏览器的控制台中评估它的选择器,在 search_rows 对象中收集了 WebElements 列表
不隐藏第一个元素之后的元素。
或者,如果子元素共享相同的选择器,而不是遍历 WebElements 列表,只需在选择器中使用数字谓词。