Besoin de trouver un élément dans le sélénium par css

<!-Je veux trouver l'élément de ce lien "US states" dans <h5>. Je suis en train d'essayer cela dans craigslist. Toute aide sera très appréciée

<!-Voici l'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">
26
demandé sur Yi Zeng 2013-08-17 15:32:55

3 réponses

N'utiliser que les noms de classe n'est pas suffisant dans votre cas.

  • By.cssSelector(".ban") a 15 noeuds correspondants
  • By.cssSelector(".hot") a 11 noeuds correspondants
  • By.cssSelector(".ban.hot") a 5 nœuds correspondants

par conséquent, vous avez besoin de plus de restrictions pour la réduire. Options 1 et 2 ci-dessous sont disponibles pour le sélecteur css, 1 pourrait être celui qui convient le mieux à vos besoins.

Option 1: Utilisation de l'index des éléments de liste (CssSelector ou XPath)

Limitations

  • pas assez stable si la structure du site change

Exemple:

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

Option 2: Utilisation deFindElements, alors indexez-les. (CssSelector ou XPath)

Limitations

  • pas assez stable si la structure du site change
  • pas le sélecteur natif

Exemple:

// 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: Utilisation de texte (XPath)

Limitations

  • Pas pour les sites multilingues
  • Uniquement pour XPath, pas pour le Sélénium est CssSelector

Exemple:

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

Option 4: Index le sélecteur groupé (XPath uniquement)

Limitations

  • pas assez stable si la structure du site change
  • seulement pour XPath, pas CssSelector

Exemple:

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

Option 5: Trouver le lien des éléments de la liste cachée par href, puis revenir à h5 (XPath seulement)

Limitations

  • seulement pour XPath, pas CssSelector
  • faible performance
  • Difficile De XPath

Exemple:

driver.FindElement(By.XPath(".//li[.//ul/li/a[contains(@href, 'geo.craigslist.org/iso/us/al')]]/h5"));
64
répondu Yi Zeng 2014-07-11 03:23:43

By.cssSelector(".ban") ou By.cssSelector(".hot") ou By.cssSelector(".ban.hot") devrait tous la sélectionner à moins qu'il y ait un autre élément qui possède ces classes.

In CSS,.name moyen de trouver un élément qui a une classe avec name. .foo.bar.baz signifie Trouver un élément qui possède toutes ces classes (dans le même élément).

cependant, chacun de ces sélecteurs sélectionnera seulement le premier élément qui correspond sur la page. Si vous avez besoin de quelque chose de plus spécifique, s'il vous plaît poster le HTML des autres éléments qui ont ces classes.

0
répondu Nathan Merrill 2013-08-17 12:06:30

Vous pouvez décrire votre sélection css comme une feuille de style en cascade:

protected override void When()
{
   SUT.Browser.FindElements(By.CssSelector("#carousel > a.tiny.button"))
}
0
répondu dnvtrn 2014-07-01 23:00:04