[英]Selenium WebDriver: findElement() in each WebElement from List<WebElement> always returns contents of first element
Page page = new Page();
page.populateProductList( driver.findElement( By.xpath("//div[@id='my_25_products']") ) );
class Page
{
public final static String ALL_PRODUCTS_PATTERN = "//div[@id='all_products']";
private List<Product> productList = new ArrayList<>();
public void populateProductList(final WebElement pProductSectionElement)
{
final List<WebElement> productElements = pProductSectionElement.findElements(By.xpath(ALL_PRODUCTS_PATTERN));
for ( WebElement productElement : productElements ) {
// test 1 - works
// System.out.println( "Product block: " + productElement.getText() );
final Product product = new Product(productElement);
// test 2 - wrong
// System.out.println( "Title: " + product.getUrl() );
// System.out.println( "Url: " + product.getTitle() );
productList.add(product);
}
// test 3 - works
//System.out.println(productElements.get(0).findElement(Product.URL_PATTERN).getAttribute("href"));
//System.out.println(productElements.get(1).findElement(Product.URL_PATTERN).getAttribute("href"));
}
}
class Product
{
public final static String URL_PATTERN = "//div[@class='url']/a";
public final static String TITLE_PATTERN = "//div[@class='title']";
private String url;
private String title;
public Product(final WebElement productElement)
{
url = productElement.findElement(By.xpath(URL_PATTERN)).getAttribute("href");
title = productElement.findElement(By.xpath(TITLE_PATTERN)).getText();
}
/* ... */
}
我試圖用Selenium“解析”的網頁有很多代碼。 我需要處理其中包含產品網格的一小部分。 對於populateProductList()
調用,我傳遞包含所有產品的DOM的結果部分。 (在Chrome中運行該XPath會返回預期的all_products節點。)
在該方法中,我將產品分成25個單獨的Web元素,即產品塊。 (這里我也確認它適用於Chrome並返回節點列表,每個節點都包含產品數據)
接下來,我想迭代結果列表,並將每個WebElement
傳遞給Product()
構造函數,該構造函數為我初始化Product
。 在我這樣做之前,我進行了一個小測試並打印出產品塊(參見測試1); 在每個迭代中打印出單獨的塊。
執行產品分配后(再次,在Chrome中確認xpath),我運行另一個測試( 參見測試2 )。
問題:這次測試只返回FIRST產品的url / title對進行EACH迭代。
除此之外,我嘗試將Product
的findElement()
調用移動到循環中,但仍然遇到同樣的問題。 接下來,我嘗試運行findElement**s**()
並對結果執行get(i).getAttribute("href")
; 這次它正確返回了單個產品URL(參見測試3)。
然后,當我做了findElements(URL_PATTERN)
在單一productElement
內循環,並奇跡般地返回所有產品網址......這意味着findElement()
總是返回從一組的25種產品的第一款產品,而我期望WebElement
只包含一個產品。
我認為這看起來像引用的問題,但我無法想出任何東西或在線找到解決方案。
對此有何幫助? 謝謝!
java 1.7.0_15,Selenium 2.45.0和FF 37
問題出在產品定位器的XPATH中。
下面硒XPath表達式意味着你正在尋找它可以隨時隨地在文檔匹配的元素。 正如你所想的那樣,與父母無關!
//div[@class='url']/a
這就是為什么它總是返回相同的第一個元素。
因此,為了使它相對於父元素,它應該如下所示。 (只是一個。之前//)
public final static String URL_PATTERN = ".//div[@class='url']/a";
public final static String TITLE_PATTERN = ".//div[@class='title']";
現在,您可以搜索相對於父元素的匹配子元素。
硒中的XPATH如下所示。
/a/b/c --> Absolute - from the root
//a/b --> Matching element which can be anywhere in the document (even outside the parent).
.//a/b --> Matching element inside the given parent
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.