2013-08-17 16 views
26

私はこのリンクの要素 "us states"を<h5>に見つけたいと思います。私はcraigslistでこれを試しています。すべてのヘルプは非常にここでcssでセレンの元素を見つける必要があります

を理解されるであろうURLです。これらのクラスを持っている別の要素が存在しない限りhttp://auburn.craigslist.org/

<html class=""> 
<head> 
<body class="homepage w1024 list"> 
    <script type="text/javascript"> 
    <article id="pagecontainer"> 
      <section class="body"> 
     <table id="container" cellspacing="0" cellpadding="0" 
    <tbody> 
      <tr> 
    <td id="leftbar"> 
    <td id="center"> 
    <td id="rightbar"> 
     <ul class="menu collapsible"> 
      <li class="expand s"> 
      <li class="s"> 
      <li class="s"> 
       <h5 class="ban hot">us states</h5> 
       <ul class="acitem" style="display: none;"> 
      </li> 
     <li class="s"> 
     <li class="s"> 

答えて

62

あなたの場合、クラス名を使用するだけでは不十分です。

  • By.cssSelector(".ban")
  • By.cssSelector(".hot")は11個の一致するノード
  • By.cssSelector(".ban.hot")を持っている15個の一致するノードを持っているので、あなたがそれを絞り込むために、より制限を必要とする5つの一致するノード

を持っています。 以下のオプション1と2をCSSセレクタで利用できます.1つはあなたのニーズに最も適したものかもしれません。

オプション1:リスト項目のインデックス(CssSelectorまたはXPathの)

制限を使用して十分に安定

  • ないサイトの構造が

例変更された場合:

driver.FindElement(By.CssSelector("#rightbar > .menu > li:nth-of-type(3) > h5")); 
driver.FindElement(By.XPath("//*[@id='rightbar']/ul/li[3]/h5")); 

オプション2:SeleniumのFindElementsを使用してインデックスを付けます。(CssSelectorまたはXPathの)

制限十分に安定

  • ないサイトの構造が
  • ないネイティブセレクタの方法を変更した場合

例:

// note that By.CssSelector(".ban.hot") and //*[contains(@class, 'ban hot')] are different, but doesn't matter in your case 
IList<IWebElement> hotBanners = driver.FindElements(By.CssSelector(".ban.hot")); 
IWebElement banUsStates = hotBanners[3]; 

オプション3:テキストを使用して(XPathののみ)多言語サイトの

制限

  • ない
  • のみのXPathのためではなく、セレンのCssSelectorため

例:

driver.FindElement(By.XPath("//h5[contains(@class, 'ban hot') and text() = 'us states']")); 

オプション4:インデックスグループ化セレクタ(のみのXPath)

制限

  • ないサイトの構造のみのXPath、ないCssSelector
ため
  • を変更する場合は十分に安定

    例:

    driver.FindElement(By.XPath("(//h5[contains(@class, 'ban hot')])[3]")); 
    

    オプション5:のみのXPath、ないCssSelectorのための隠されたリスト項目がHREFでリンク見つけ、その後、H5に戻ってトラバース(のみのXPath)

    制限

    • 低パフォーマンス
    • トリッキーXP ATH

    例:

    driver.FindElement(By.XPath(".//li[.//ul/li/a[contains(@href, 'geo.craigslist.org/iso/us/al')]]/h5")); 
    
  • +1

    By.cssSelector( "ban.hot:nth-of-type(3)") –

    +0

    これは李Zengsの答えに加えています。何らかの理由で、彼はあなたがcssSelectorでクラス名とn番目の-の型を使用できることを言及しませんでした。クラス名を含むN番目の要素を取得するために要素のリストを調べる必要はありません。 –

    +0

    @Vlad:指摘ありがとうございます。 'nth-of-type'はCSS3で、これは当時のすべてのブラウザでSereniumによって完全にサポートされていませんでした。それは今サポートされているかもしれませんが、確認する機会はありません。最新のSeleniumでテストしましたか? –

    0

    By.cssSelector(".ban")またはBy.cssSelector(".hot")またはBy.cssSelector(".ban.hot")はすべてそれを選択する必要があります。

    CSSでは、.nameは、nameのクラスを持つ要素を見つけることを意味します。 .foo.bar.bazは、(同じ要素内の)これらのクラスのすべてを持つ要素を見つけることを意味します。

    ただし、これらのセレクタのそれぞれは、ページ上で一致する最初の要素のみを選択します。より具体的なものが必要な場合は、それらのクラスを持つ他の要素のHTMLを投稿してください。

    +0

    はみんなそれを感謝! – ktmrocks

    0

    あなたはカスケードスタイルシートdowsのようなあなたのCSSの選択を記述することができます。

    protected override void When() 
    { 
        SUT.Browser.FindElements(By.CssSelector("#carousel > a.tiny.button")) 
    } 
    
    関連する問題