WebDriver/PageObject/FindBy: comment spécifier xpath avec dynamique de la valeur?
Je suis en train d'utiliser Objet Page modèle en Java et ayant quelques problèmes avec @FindBy/XPath.
Plus tôt, j'ai utilisé la suite de la construction en Groovy:
driver.findElement(By.xpath("//td[contains(text(),'$SystemName')]")).click()
Here, SystemName is a parameter that can be different.
Maintenant, je veux faire la même chose mais en accord avec le paradigme Objet en Java:
public class ManagedSystems {
private WebDriver driver;
@FindBy(id="menu_NewSystem")
private WebElement menuNewSystem;
@FindBy (xpath = "//td[contains(text(),'$SystemName')]") //??? How to use SystemName from deleteSystem method (below)?
private WebElement plantSystemName;
....
public SystemHomePage deleteSystem (String systemName) {
plantSystemName.click();
}
}
Dans mon test, j'appelle deleteSystem:
SystemHomePage.deleteSystem("Firestone");
Question: Comment lier @FindBy de notation pour les PlantSystemName et SystemName spécifié pour deleteSystem?
Grâce,
Racoon
pourquoi n'êtes-vous pas en suivant les conventions java? Java Membres et des Méthodes doit être en camelcase pas PascalCased.
Merci, a fait quelques changements.
tout est question de préférence personnelle, mais par les conventions java, nous utilisons camelCasing 🙂
Je suis très bien avec les deux. Aucune idée sur ma question est apprécié 🙂
Merci, a fait quelques changements.
tout est question de préférence personnelle, mais par les conventions java, nous utilisons camelCasing 🙂
Je suis très bien avec les deux. Aucune idée sur ma question est apprécié 🙂
OriginalL'auteur Racoon | 2014-01-21
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas le faire, les Annotations sont des valeurs constantes stockées dans le fichier de classe. Vous ne pouvez pas calculer lors de l'exécution.
Voir Peut l'annotation des variables déterminées au moment de l'exécution?
C'est parce qu'il n'en est pas une, c'est la façon dont les annotations en langage Java. Les gens à surmonter cette en ne cherchant pas à faire ce que vous essayez de faire.
Ardesco, merci. Donc, dois-je comprendre le droit qu'il y a deux options: 1) utiliser seulement statique XPath. Mais ce n'est pas toujours possible; 2) Ne pas utiliser PageFactory & annotations à tous. Mettre en œuvre des Objets de Page sur mon propre. Dans ce cas, existe-il des meilleures pratiques?
Vous pouvez mélanger et assortir, vous pouvez utiliser PageFactory et des annotations et vous pouvez définir quelques Par dans votre page objet qui utilisent créé dynamiquement XPath.
Ardesco, merci! J'ai publié la solution basée sur votre suggestion. Elle fonctionne. Tous les commentaires sur comment faire mieux sont appréciés.
OriginalL'auteur Ardesco
Grâce à Ardesco et Robbie, je suis venu avec la solution suivante:
OriginalL'auteur Racoon
Vous utilisez une page de l'objet de l'usine plutôt que de se contenter de suivre la page de l'objet modèle.
Vous pouvez créer des objets de page comme de simples classes avec des identifiants stockés comme des variables privées, et les méthodes d'exposer les éléments à l'aide de ces variables, et vous êtes toujours à la suite de la page objet de modèle.
découvrez ce; http://relevantcodes.com/pageobjects-and-pagefactory-design-patterns-in-selenium/
Si vos identifiants sont juste des variables, alors vous pouvez utiliser n'importe quelle manipulation que vous voulez
J'ai essayé de dire que, yo ne pas avoir à utiliser la Page de l'Usine à suivre la Page de l'Objet modèle. Je trouve qu'il me limite trop pour des raisons telles que vous avez trouvé.
Robbie, merci. OK, oublions PageFactory. Comment voulez-vous mettre en œuvre un WebElement dynamique avec XPath?
OriginalL'auteur Robbie Wareham
J'ai utilisé une autre solution de contournement pour ce qui nous permettra d'utiliser dynamique xpath même avec la page d'usine.
Solution: Ajouter le chemin xpath de l'élément parent qui est statique et de référence de l'élément enfant avec dynamique de trajectoire.
Dans votre cas, //td[contient(text(),'$SystemName'), parent de l'élément de td peut être " tr " ou "table". Si le tableau est statique, utilisez code ci-dessous:
Maintenant, dans votre script, accéder à une table(de sorte que sa référence est chargé en mémoire) et ensuite appeler la getDynamicElement méthode.
OriginalL'auteur Aftaab Siddiki