当前位置: 首页 > 知识库问答 >
问题:

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

狄玉书
2023-03-14

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

目前,我不知道如何通过在findElement(by)函数中显式提供父WebElement的上下文而不是POF的自动机制来显式地获得它们。问题是如何使上下文成为PageObject类的WebElement而不是驱动程序对象。我还没有找到任何可以理解的网页文章来解释如何做到这一点。有人能用一个例子来解释一个简单的方法吗。。。。我将非常感激。下面是解释测试类和表示产品的类的代码。

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个答案

凌伟泽
2023-03-14

这是对我有效的真正解决方案,也是我一直在寻找的。Selenium Web驱动程序:使用相对于其他元素的路径进行页面工厂初始化?

劳彦
2023-03-14

您可能希望在TestProducts中使用“factory”方法来生成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从该根获取项信息。例如,产品项中的子价格

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();

请注意,我刚刚在这里输入了这个,所以请原谅语法错误...这里应该有足够的内容让你明白漂移。

燕承安
2023-03-14

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

 类似资料:
  • 对登录页面使用页面对象模型和页面分解,在登录页面中获取对象。java和操作在LoginScript中。JAVA我有一个java。“Ele_usernamedit.clear();”行中的lang.NullPointerException请帮助检查代码。谢谢 这是我的登录页。爪哇: 这是我的登录cript.java:

  • 我是一名新的测试工程师,一直在阅读页面对象模型并实现它们,并不断遇到页面工厂。我知道页面工厂是一个POM,它提供了额外的功能,例如在调用页面工厂时实例化所有元素,以及更可读的测试代码(尽管我不完全赞同可读性)。明确地说,我对POM很感兴趣。代码的可重用性和相对容易的维护非常好,我正在朝着这个方向努力。 我要回答的两个问题是: 为什么我要实例化所有元素,而不是动态地进行

  • 本文向大家介绍iframe父页面如何获取子页面的元素?相关面试题,主要包含被问及iframe父页面如何获取子页面的元素?时的应答技巧和注意事项,需要的朋友参考一下 在父页面监听 onmessage,子页面 postMessage。 $('iframe')[0].contentWindow.document.getElementById document.frames['xx'].document.

  • 我遵循这里的POM指南 问题是当输入有效的用户/密码时,POM正在返回新的HomePage(驱动程序),新的HomePage构造函数正在通过传递的驱动程序验证我们实际上在“主页”页面上。自然,驱动程序被打开到登录页面,所以在主页上查找元素是徒劳的。POM方法应该如何将“PageFactory”主页对象实际“打开”返回到主页?

  • 我遵循了一个关于如何在执行任何操作之前关闭随机打开的弹出窗口的教程: https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-popup-alerts/ 其思想是创建一个ElementProxy类,该类实现接口调用处理程序。因此,在调用实际方法之前,将首先调用代理的invoke方法。 因此,我们在调用Web

  • 创建基类: 然后初始化页面对象: 然后创建测试用例: 输出: 请告诉我怎么了。