2017-10-12 14 views
0

動的に生成されるロケータは、リストから選択される要素によって異なります。例えばワイルドカードを使用するPagefactory動的Web要素

、これは私の生成されたIDです:

Function:TableName:0:submenuAction 

0は、最初の要素はリストから選択されることを意味、カウンタです。カウンタの前後のすべての文字列は変更されないので、xpathメソッドが含まれていません。

のようなワイルドカードを使用できますか?Function:TableName:{X}:submenuAction {x}は整数です。

選択した要素の数を格納できますが、この変数をpagefactory要素内でどのように使用できますか? driver.findelementはstaleElementExceptionで失敗する可能性があります。なぜ私はPageFactoryを使用したいのですか?

+0

通常、ページのDOM状態を変更した後に要素にアクセスしようとすると、古い要素エラーが発生します。したがって、要素を使用する場合は、参照をすぐに取得してから、何らかのアクションを実行する必要があります。失効した要素のエラーを引き起こすための擬似書を書いています。 1.ページ上の任意の要素の参照を取得する(driver.findelement(....)) 2.リフレッシュページ(driver.manage.navigate.refresh()) 3.現在その要素をクリックしようとするelement.click()) - >不正な要素エラーが発生します。 –

答えて

2

あなたが渡しているものは、PageFactoryアノテーションで使用される定数(たとえば、Javaではfinal static)でなければなりません。コメントで述べた古い確認戦略の一部に加えて

private final static int ITEM_INDEX = 2; 

... 

@FindBy(xpath="Function:TableName:"+ ITEM_INDEX + ":submenuAction") 
private WebElement targetListItem; 

、あなたはまた、その後にインデックスを作成、収集(例えばList<WebElement>)にそれらの動的特定されたすべての要素を結合しようとする場合があります:

@FindBy(xpath="...") 
private List<WebElement> allListEntries; 

... 

private WebElement getTargetListEntry(int index) { 
    return allListEntries.get(index); 
} 
+0

問題は、定数でなければならないということです。 forループの直後のインデックス値はわかりません。私が知る限り、定数はそのように変更または初期化することはできません。何か案が? – brobee

+0

ああ、そうです。目的のインデックスを動的に計算すると、2番目の例(その動的リスト内のすべてのアイテムを取得してインデックスを作成する)がおそらく実行する必要があります。 –