2017-02-09 38 views
1

セレンテストをページオブジェクトモデル(および拡張子@FindBy)を使用して変換しようとしています。私はこのようないくつかのオブジェクト定義している:@FindByを使用して親オブジェクトを変換Selenium/PageFactory:親要素の@FindByを使用して子要素を検索しますか?

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

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

が簡単である:(I「はこのISNを、可能な場合

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

は基本的に、私は、このような何かをしたいを知っています実際のコードをtは、これは単なる擬似例です:

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

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

しかし、あまりにもトン内の子要素を対象と方法があります彼の親要素は@FindBy?です。ページ上の他の要素と同じ名前またはクラス名を共有する可能性がある特定の要素をページ上でターゲットにしているため、この方法で行う必要があります。ありがとう!

+0

DOMのこの要素の子ですか? –

+0

はい。上記の疑似コードの例を追加しました。 – kroe761

+0

'child'と' parent'は別のクラスにありますか? –

答えて

2

あなたがしようとしていることは、カスタムを書くことなく簡単に達成することはできませんElementLocatorFactory

まず、XPathを使用することをお勧めします。 これはそれをつかむために簡単に多くのことをするだろう:
ちょうどこのような第三<table>@FindBy(xpath = "\\table[3]")、ちょうどこのような第三の表の...
第二<li>@FindBy(xpath = "\\table[3]\li[2]")を。

@FindByアノテーションを使用して実際にやりたければ、ElementLocatorFactoryに行くことができます。コンテキストを提供します要素と

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

クラス:

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

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

その子:

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

使用法:

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

あなたがする必要はありませんカスタムを書くElemLocatorFactoryの代わりにorg.openqa.selenium.support.pagefactory.DefaultElementLocatorFactoryを代わりに使用してください:

Parent parent = PageFactory.initElements(driver, Parent.class); 
DefaultElementLocatorFactory parentContext = new DefaultElementLocatorFactory(parent.getTable()); 
Child child = new Child(); 
PageFactory.initElements(parentContext, child); 
関連する問題