web-dev-qa-db-ja.com

cssでSeleniumの要素を見つける必要がある

<h5>でこのリンクの要素「us states」を見つけたいです。クレイグリストでこれを試しています。どんな助けも大歓迎です

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">
28
ktmrocks

クラス名を使用するだけでは不十分です。

  • By.cssSelector(".ban")には15個の一致するノードがあります
  • By.cssSelector(".hot")には11個の一致するノードがあります
  • By.cssSelector(".ban.hot")には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のみ)

制限事項

  • 多言語サイト用ではありません
  • SeleniumのCssSelectorではなく、XPathのみ

例:

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

オプション4:グループ化されたセレクターにインデックスを付ける(XPathのみ)

制限事項

  • サイトの構造が変更された場合、十分に安定しない
  • CssSelectorではなく、XPathのみ

例:

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

オプション5:hrefで非表示のリストアイテムリンクを検索し、h5(XPathのみ)に戻ります

制限事項

  • CssSelectorではなく、XPathのみ
  • 低性能
  • トリッキーなXPath

例:

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

By.cssSelector(".ban")またはBy.cssSelector(".hot")またはBy.cssSelector(".ban.hot")は、これらのクラスを持つ別の要素がない限り、すべて選択する必要があります。

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

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

0
Nathan Merrill

CSSの選択は、カスケードスタイルシートのダウのように記述できます。

protected override void When()
{
   SUT.Browser.FindElements(By.CssSelector("#carousel > a.tiny.button"))
}
0
dnvtrn