1

私はスプリンターでいくつかのブラウザテストを書いており、独自のタイトル、ボタンなどを含む明確に定義された行を持つページを持っています。

ここに画像の説明を入力

私の特定のケースでは、次のように単一の行を取得できます。

row = lambda title: browser.find_by_xpath("//div[@class='my-row'][contains(., '{0}')]".format(title))

row1 = row('Row 1')
row2 = row('Row 2')

次に、このランバで:

button = lambda elmt, text: elmt.find_by_xpath("//a[@class='btn'][contains(.,'{0}')]".format(text))

正しい通常のボタンに焦点を合わせるか、次のように言うことができます。

assert button(row1, 'Special button')
assert not button(row2, 'Special button')

しかし、ボタン ラムダを呼び出すと、他の行からボタンが返されます。

私の理解では、このランバを介して xpath で検索すると、「elmt から始めて、指定されたテキストを含むelmt 内にネストされたボタンを探します」と表示されます。ただし、現在の行にネストされていない他の行から取得しているため、ここで何が欠けていますか?

xpath の何が問題になっていますか?

4

1 に答える 1

1

ドキュメントのルート//ノードから始まるXPath 式は、ドキュメント内の位置に関係なくノードを選択します。そのような式の現在のコンテキスト ノード。たとえば、

//div

返される結果セットには影響しません。コンテキスト ノードから始まる (descendant-or-self::) 軸を検索するには//、次を使用する必要があります。

.//div

あなたの場合、これは変更を意味します

button = lambda elmt, text: elmt.find_by_xpath("//a[@class='btn'][contains(.,'{0}')]".format(text))

button = lambda elmt, text: elmt.find_by_xpath(".//a[@class='btn'][contains(.,'{0}')]".format(text))

(注意: コード内の XPath 式に関するすべてです。残りについてはコメントできません。)

于 2015-04-17T18:49:27.490 に答える