it-swarm.com.de

Element in Selen von css zu finden

Ich möchte das Element dieses Links "us states" in <h5> finden. Ich versuche das in Craigslist. Jede Hilfe wird sehr geschätzt 

Hier ist die 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

Nur die Verwendung von Klassennamen reicht in Ihrem Fall nicht aus.

  • By.cssSelector(".ban") hat 15 übereinstimmende Knoten
  • By.cssSelector(".hot") hat 11 übereinstimmende Knoten
  • By.cssSelector(".ban.hot") hat 5 übereinstimmende Knoten

Daher benötigen Sie weitere Einschränkungen, um sie einzugrenzen. Die Optionen 1 und 2 unten sind für den CSS-Selector verfügbar. Möglicherweise ist 1 derjenige, der Ihren Anforderungen am besten entspricht.

Option 1: Index der Listenelemente (CssSelector oder XPath) verwenden

Einschränkungen

  • Nicht stabil genug, wenn sich die Struktur der Site ändert

Beispiel:

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

Option 2: FindElements von Selenium verwenden, dann indizieren. (CssSelector oder XPath)

Einschränkungen

  • Nicht stabil genug, wenn sich die Struktur der Site ändert
  • Nicht der Weg des nativen Wählers

Beispiel:

// 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];

Option 3: Verwenden von Text (nur XPath)

Einschränkungen

  • Nicht für mehrsprachige Websites
  • Nur für XPath, nicht für Selenium CssSelector

Beispiel:

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

Option 4: Indizieren Sie den gruppierten Selektor (nur XPath)

Einschränkungen

  • Nicht stabil genug, wenn sich die Struktur der Site ändert
  • Nur für XPath, nicht für CssSelector

Beispiel:

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

Option 5: Findet den Link zu den versteckten Listenelementen nach href und geht dann zurück zu h5 (nur XPath)

Einschränkungen

  • Nur für XPath, nicht für CssSelector
  • Schlechte Leistung
  • Tricky XPath

Beispiel:

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

By.cssSelector(".ban") oder By.cssSelector(".hot") oder By.cssSelector(".ban.hot") sollten alle auswählen, es sei denn, ein anderes Element enthält diese Klassen.

In CSS bedeutet .name das Finden eines Elements, das eine Klasse mit name enthält. .foo.bar.baz bedeutet, ein Element zu finden, das alle diese Klassen enthält (in demselben Element).

Jeder dieser Selektoren wählt jedoch nur das erste Element aus, das mit dem Element auf der Seite übereinstimmt. Wenn Sie etwas genaueres benötigen, geben Sie bitte den HTML-Code der anderen Elemente an, die diese Klassen enthalten.

0
Nathan Merrill

Sie können Ihre CSS-Auswahl wie Cascading Stylesheets beschreiben:

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