2013-02-08 17 views
5

私はセレンで始まり、今、この要素を選択する必要があるのです:このスパン要素はどのようにして選択できますか?

<span class=" close">Matrices</span> 

このコード行はゼロ要素を返しますので、私はそれが

ReadOnlyCollection<IWebElement> matrixLink = driver.FindElements(By.PartialLinkText("Matrices")); 

右1 :-)ではないと思いますしかし、私はXpath以外の適切なものを見つけることができませんでしたが、これは(//*[@id=\"Navigation\"]/div[2]/div[2]/ul/li[7]/span)のように見えます。

EDIT: スパンには「close」というクラスがあります。 それは19スパンのクラスでは、「閉じる」がメニューの一部だ、それは残念ながらユニークなセレクタではありませんので....これらのケースについて

+0

スパンには空のクラスがありますか? –

+0

ああ、良かったです。それはクリックされてもクラスがなく、質問を編集します。しかし、それはメニュー項目で、私はそれをチェックしました。クラス 'close'で19個のスパン(メニュー項目)があり、クリックされた項目には 'close'クラスが削除されています。 – Michel

+0

'// * [@ id = \" Navigation \ "] /子孫::スパン[text()= '行列']'は動作しますか? – Arran

答えて

8

とのN番目の要素は、これが動作すること:

//*[@id=\"Navigation\"]/descendant::span[text()='Matrices'] 

注意をあなたは、主に、あなたのXPathクエリで特定することができた場合には読みやすさを向上させ、パフォーマンスを向上させます。つまり、クエリ内の*は、すべての要素をページにクエリします。私はナビゲーション要素がある要素の種類を知りませんが、あなたはそれが正確な要素を入力します置く必要があり、それはdiv要素だ場合、たとえば、それを作る:

//div[@id=\"Navigation\"]/descendant::span[text()='Matrices'] 

このXPathのための若干の説明がありますNavigation要素を取得し、内の任意の部分を参照してと表示し、のテキストを持つspan要素を見つけます。 XPathのdescendantビットがなければ、の直接の子のみを検索します。これは、Navigationの子要素、それ以外の要素を意味します。つまり、要素がNavigationの子であるTestDivの子である場合は、descendantがそれをキャッチしますが、結果は返されません。

なぜBy.PartialLinkTextが機能しないのかについては、アンカーリンクのみを検索します。あなたが見たように、アンカーリンクにはspanという要素が含まれていることがよくありますが、時にはそれ自体がspanです。

By.PartialLinkText同様にBy.LinkTextはアンカー要素ではないため、この要素を「認識」しません。

2

私のお気に入りの問題ソルバー:

が表示されます。しかし、私が使用するセレンIDEで使用すると、「ターゲット」で

  • を必要とするリンクをクリックしてくださいアプローチ、(そのような//span[7]か何か)「近い」クラス

  • +1

    7番目の要素のxpathは機能しますが、メニューが余分な項目を取得すると、それはもはや7番目の項目です... – Michel

    +0

    合意した私の場合は、Web GUIの変更がそれほど頻繁でも侵入的でもないので、完璧に動作します –

    2

    あなたは// span [text()= 'Matrices']を使用できます。 あなたの要素を選択します。

    関連する問題