2015-03-17 4 views
0

Я делаю тест автоматизации селена, где я получаю список веб-элементов, а затем получаю дочерние элементы каждого из них. но, к сожалению, когда я это делаю, он получает только дочерние элементы из первого элемента из списка, который является странным. может ли кто-нибудь указать, где пошло не так? Благодарю.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)"; 

Спасибо. Мне действительно нужно быстро решить эту проблему.

ответ

0

XPath, начинающийся с //, является глобальным, даже если вы выполняете его из контекста другого элемента.

Попробуйте использовать .// вместо этого, чтобы ограничить его дочерними элементами элемента.

+0

Спасибо! Я забыл о .// thingy! Большое спасибо! – Cooperisduhace

0

Убедитесь, что: -

  1. вы собрали список WebElements в объекте search_rows по degugging код или путем оценки его селектор в консоли любого веб-браузера

  2. элементы сменив первый элемент не скрыт.

Или вместо итерации по списку WebElements просто использовать числовой предикат в ваших селекторах, если дочерние элементы один и тот же селектор.

Смежные вопросы