web-dev-qa-db-fra.com

Besoin de trouver un élément dans Selenium par css

Je veux trouver l'élément de ce lien "états américains" dans <h5>. J'essaie ceci dans Craigslist. Toute aide sera grandement 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">
28
ktmrocks

Utiliser uniquement des noms de classe n'est pas suffisant dans votre cas.

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

Par conséquent, vous avez besoin de plus de restrictions pour le réduire. Les options 1 et 2 ci-dessous sont disponibles pour le sélecteur css, le 1 peut être celui qui répond le mieux à vos besoins.

Option 1: Utilisation de l'index des éléments de la 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: Utilisez la variable FindElements de Selenium, puis indexez-les. (CssSelector ou XPath)

Limitations

  • Pas assez stable si la structure du site change
  • Pas comme 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: Utiliser du texte (XPath uniquement)

Limitations

  • Pas pour les sites multilingues
  • Seulement pour XPath, pas pour CssSelector de Selenium

Exemple:

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

Option 4: Indexer 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: Trouvez le lien des éléments de liste cachés par href, puis retournez à h5 (XPath uniquement)

Limitations

  • Seulement pour XPath, pas CssSelector
  • Faible niveau de rendement
  • XPath Tricky

Exemple:

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

By.cssSelector(".ban") ou By.cssSelector(".hot") ou By.cssSelector(".ban.hot") doivent tous le sélectionner, sauf si un autre élément contient ces classes.

.name signifie qu'en CSS, trouve un élément qui a une classe avec name. .foo.bar.baz signifie rechercher un élément contenant toutes ces classes (dans le même élément).

Cependant, chacun de ces sélecteurs ne sélectionnera que le premier élément qui lui correspond sur la page. Si vous avez besoin de quelque chose de plus spécifique, publiez le code HTML des autres éléments contenant ces classes.

0
Nathan Merrill

Vous pouvez décrire votre sélection css comme des feuilles de style en cascade:

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