如何将页面对象工厂框架用于webelement的子元素

时间:2016-08-17 03:15:31

标签: java selenium selenium-webdriver webdriver pageobjects

我有一个搜索结果页面,其中包含许多作为搜索结果生成的产品项目。我可以得到产品清单。 但是有价格,折扣,运费等产品细节作为子元素在这些元素中。如何使用页面对象工厂模型通过@FindBy注释自动获取这些子元素的值。

目前我不知道如何通过明确地在findElement(By)函数中提供父WebElement的上下文而不是POF的自动机制来明确地获取它们。问题是如何将上下文作为WebElement而不是PageObject类的驱动程序对象。我无法找到任何可理解的网络文章来解释如何做到这一点。有人可以通过一个例子来解释一个简单的方法吗?我真的很感激。 下面是解释测试类和代表产品的类的代码。

public class TestProducts {

.....
 //I can get the list of products from a 
 List<WebElement> we_prod_box_list = driver.findElements(By.xpath("//div[@id='content']/descendant::div[starts-with(@class,'product_box_container')]"));
.....
}

public class ProductItem {

private WebDriver driver = null;
private Actions action = null;
private WebElement we_prod_box = null;

public String we_prod_box_title = "";
public WebElement we_pt = null;
public String slideImgTitle = "";
public String oldPrice = "";
public String oldPriceTitle = "";
public String subPrice = "";
public WebElement we_purch_disc = null;
private WebDriverWait wait = null;
public String shippingText = "";
public String shippingCost = "";
public String discPrice = "";
    .....

    we_pt = we_prod_box.findElement(By.xpath(".//div[contains(@class, 'subcategor_price_tag')]"));
slideImgTitle = we_pt.findElement(By.xpath(".//div[contains(@class, 'subcategor_slideimgtitle')]")).getText();
oldPrice = we_prod_box.findElement(By.xpath(".//div[contains(@class, 'oldprice')]")).getText();
oldPriceTitle = we_prod_box.findElement(By.xpath(".//div[contains(@class, 'oldprice')]")).getAttribute("title");
subPrice = we_prod_box.findElement(By.xpath(".//span[contains(@class, 'sub-price')]")).getText();
     ......
}

3 个答案:

答案 0 :(得分:0)

您可以使用@FindBy将包含产品项属性的4个webelements分成4个不同的列表。只需将这些元素的完整xpath传递给FindBy即可。 您可以迭代列表以获取单个值来测试或创建Product Item对象等等......

答案 1 :(得分:0)

你想要一个&#34;工厂&#34; TestProducts中生成ProductItem实例的方法:

TestProducts.getProductItems() {
    List<ProductItem> items = new ArrayList<ProductItem>();
    List<WebElement> we_prod_box_list = driver.findElements(By.xpath("//div[@id='content']/descendant::div[starts-with(@class,'product_box_container')]"));
    for (WebElement item : we_prod_box_list) {
        ProductItem newItem = new ProductItem(driver, item.getUniqueIdOfItemContainer);
        items.add(newItem);

当然,这意味着ProductItem有一个构造函数,它接受一个表示该项的唯一id的参数......我经常在项目周围的div包装器上看到一个属性。然后构造函数设置id,例如itemWrapperId,供其他方法使用。

然后,ProductItem方法使用findElements从该根获取项目信息。例如。对于ProductItem中的subPrice

private itemWrapperLocator = "//div[@id='content']/descendant::div[@class,'product_box_container" + itemWrapperId + "')]";

public String subPriceLocator = ".//span[contains(@class, 'sub-price')]";
public getSubPrice() {
    this.driver.findElement(By.xpath(this.itemWrapperLocator)).findElement(By.xpath(subPriceLocator)).getText();

请注意,我只是在这里输入了这个,所以请原谅语法错误......这里应该有足够的东西让你得到漂移。

答案 2 :(得分:0)

这是真正的解决方案,对我有用,我正在寻找什么。 Selenium Webdriver: Page factory initialization using paths relative to other elements?