簡體   English   中英

Selenium WebDriver:List中每個WebElement中的findElement() <WebElement> 總是返回第一個元素的內容

[英]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迭代。

除此之外,我嘗試將ProductfindElement()調用移動到循環中,但仍然遇到同樣的問題。 接下來,我嘗試運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM