我有一个搜索结果页面,其中包含许多作为搜索结果生成的产品项目。我可以得到产品清单。 但是有价格,折扣,运费等产品细节作为子元素在这些元素中。如何使用页面对象工厂模型通过@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();
......
}
答案 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?