2016-08-17 2 views
1

J'ai une page de résultats de recherche qui contient de nombreux articles produits en tant que résultat de recherche. Je peux obtenir la liste des produits. Mais il ya des détails sur le produit comme le prix, la réduction, le prix d'expédition qui sont à l'intérieur de ces éléments webelements en tant qu'éléments enfants. Comment puis-je utiliser un modèle d'objet de page objet pour obtenir automatiquement les valeurs de ces éléments enfants à l'aide de l'annotation @FindBy.Comment utiliser l'infrastructure d'objet d'une page pour les éléments d'un composant Webelement

Pour le moment je ne sais pas comment je les obtiens explicitement en fournissant explicitement le contexte du parent WebElement dans la fonction findElement (By) plutôt que le mécanisme automatique de POF. La question est comment faire le contexte en tant que WebElement plutôt qu'un objet de pilote pour une classe PageObject. Je n'ai pas été en mesure de trouver un article Web compréhensible expliquant comment le faire. Quelqu'un pourrait-il expliquer une façon simple de le faire avec un peu d'espoir avec un exemple ... Je serais vraiment reconnaissant. Voici le code pour expliquer la classe de test et la classe pour représenter le produit.

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

Répondre

0

Vous pouvez obtenir les 4 WebElements qui contient l'attribut de l'élément de produit dans 4 listes différentes en utilisant @FindBy. Passez simplement le chemin complet de ces éléments à FindBy. Vous pouvez parcourir les listes pour obtenir des valeurs individuelles pour tester ou créer un objet article de produit etc etc ...

+0

Merci pour votre suggestion. Le problème auquel je faisais face, était que je ne pouvais pas identifier de façon unique un produit de résultat de recherche produit à la volée. Alors, comment puis-je identifier de façon unique un élément Web enfant des éléments de produit des résultats de recherche? Donc, je cherchais autre chose qui pourrait définir automatiquement les valeurs des éléments enfants en utilisant également l'annotation POF @FindBy. J'ai trouvé la réponse dans http://stackoverflow.com/questions/24251739/selenium-webdriver-page-factory-initialization-using-paths-relative-to-other-el?rq=1 – win

0

Vous voulez avoir une méthode « usine » dans TestProducts pour générer des instances 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); 

Bien sûr, cela implique que ProductItem a un constructeur qui prend un argument qui représente un identifiant unique pour cet élément ... Je vois souvent un attribut sur l'enveloppe div autour des éléments. Le constructeur établit ensuite l'identifiant, par ex. itemWrapperId, pour une utilisation par d'autres méthodes.

Les méthodes ProductItem utilisent ensuite findElements pour obtenir des informations sur les éléments à partir de cette racine. Par exemple. pour subPrice dans ProductItem

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

Notez que je viens tapé cela en ici, alors s'il vous plaît excuser les erreurs de syntaxe ... il devrait y avoir assez de place ici que vous obtenez la dérive.

+0

Merci pour votre suggestion. Le problème auquel je faisais face, était que je ne pouvais pas identifier de façon unique un produit de résultat de recherche produit à la volée. Alors, comment puis-je identifier de façon unique un élément Web enfant des éléments de produit des résultats de recherche? Donc, je cherchais autre chose qui pourrait définir automatiquement les valeurs des éléments enfants en utilisant également l'annotation POF @FindBy. J'ai trouvé la réponse dans http://stackoverflow.com/questions/24251739/selenium-webdriver-page-factory-initialization-using-paths-relative-to-other-el?rq=1 – win