2017-02-09 3 views
1

Ich versuche meine Selentests zu konvertieren, um das Page Object Model (und damit @FindBy) zu verwenden. Ich habe mehrere Objektdefinitionen wie folgt aus:Selenium/PageFactory: Finden Sie untergeordnete Elemente mit @FindBy des Elternelements?

public WebElement objectParent() { 
    return driver.findElement(By.name("parent-id")) ; 
} 

public WebElement objectChild() { 
    WebElement elem = objectParent(); 
    return elem.findElement(By.name("child-id")) ; 
} 

Converting das übergeordnete Objekt @FindBy zu verwenden ist einfach:

@FindBy(name = "parent-id") 
WebElement parentObj; 

Grundsätzlich ich so etwas wie dies tun wollen, wenn möglich (ich weiß, dieses isn‘ t echten Code, ist dies nur ein Pseudo-Beispiel:

@FindBy(name = "parent-id") 
WebElement parentObj; 

@FindBy(parentObj.name = "child-id") 
WebElement childObj; 

Aber gibt es auch eine Möglichkeit, das Kind-Element innerhalb t zu Ziel Das übergeordnete Element verwendet @FindBy?. Ich muss es auf diese Weise tun, weil ich bestimmte Elemente auf der Seite ankreuze, die denselben Namen oder Klassennamen mit anderen Elementen auf der Seite teilen. Vielen Dank!

+0

Meinst du Kinder dieses Elements in DOM? –

+0

Ja. Ich habe oben ein Pseudocode-Beispiel hinzugefügt. – kroe761

+0

Können "Kind" und "Eltern" in verschiedenen Klassen sein? –

Antwort

2

Was Sie versuchen zu tun, ist nicht leicht zu erreichen, ohne benutzerdefinierte ElementLocatorFactory schreiben.

Erstens würde ich wirklich empfehlen, XPath zu verwenden. Dies würde es einfach viel machen das packen:
3. <table> wie folgt aus: @FindBy(xpath = "\\table[3]") und ...
2. <li> in der dritten Tabelle wie folgt aus: @FindBy(xpath = "\\table[3]\li[2]").

Aber wenn Sie es wirklich mit kürzeren @FindBy Annotationen tun möchten, können Sie ElementLocatorFactory gehen.

public class FindByContextModifier implements ElementLocatorFactory { 

    private final SearchContext context; 

    public FindByContextModifier(final SearchContext context) { 
     this.context = context; 
    } 

    public ElementLocator createLocator(final Field field) { 
     return new DefaultElementLocator(context, field); 
    } 
} 

Klasse mit einem Element, das Sie mit dem Kontext bieten wird:

public class Parent { 
    @FindBy(name = "myTable") 
    WebElement table; 

    public WebElement getTable() { 
     return this.table; 
    } 
} 

Sein Kind:

public class Child { 
    @FindBy(name = "particular") 
    WebElement specialTableListElement; 
} 

Verbrauch:

Parent parent = PageFactory.initElements(driver, Parent.class); 
FindByContextModifier parentContext = new FindByContextModifier(parent.getTable()); 
Child child = new Child(); 
// This will look for the name "particular" inside the element with "myTable" name 
PageFactory.initElements(parentContext, child); 
0

Sie brauchen nicht zu schreibe eine benutzerdefinierte ElemLocatorFactory, verwenden Sie einfach org.openqa.selenium.support.pagefactory.DefaultElementLocatorFactory statt:

Parent parent = PageFactory.initElements(driver, Parent.class); 
DefaultElementLocatorFactory parentContext = new DefaultElementLocatorFactory(parent.getTable()); 
Child child = new Child(); 
PageFactory.initElements(parentContext, child); 
Verwandte Themen