2013-08-17 9 views
26

Desidero trovare l'elemento di questo collegamento "Stati Uniti" in <h5>. Sto provando questo in craigslist. Qualsiasi aiuto sarà molto apprezzatoÈ necessario trovare l'elemento nel selenio da css

Ecco 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"> 

risposta

62

Solo l'utilizzo dei nomi di classe non è sufficiente nel tuo caso.

  • By.cssSelector(".ban") ha 15 nodi corrispondenti
  • By.cssSelector(".hot") dispone di 11 nodi corrispondenti
  • By.cssSelector(".ban.hot") ha 5 nodi corrispondenti

Pertanto è necessario più restrizioni per restringere il campo. Le opzioni 1 e 2 di seguito sono disponibili per il selettore di CSS, 1 potrebbe essere quella che si adatta meglio alle tue esigenze.

Opzione 1: uso Indice voci di elenco (CssSelector o XPath)

Limitazioni

    Non
  • abbastanza stabile se la struttura del sito cambia

Esempio:

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

Opzione 2: utilizzo di Selenum FindElements, quindi indicizzarli.(CssSelector o XPath)

Limitazioni

    Non
  • abbastanza stabile se la struttura del sito cambia
  • Non il senso del selettore nativo

Esempio:

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

Opzione 3: uso di testo (XPath solo)

Limitazioni

    Non
  • per i siti multilingua
  • Solo per XPath, non per CssSelector di selenio

Esempio:

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

Opzione 4: Indice del selettore raggruppati (XPath solo)

Limitazioni

    Non
  • abbastanza stabile se la struttura del sito cambia
  • Solo per XPath, non CssSelector

Esempio:

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

Opzione 5: Trovare l'elenco nascosto oggetti dei collegamenti da href, poi attraversare di nuovo a h5 (solo XPath)

Limitazioni

  • Solo per XPath, non CssSelector
  • Basso rendimento
  • Tricky XP ath

Esempio:

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

Questa è un'aggiunta alla risposta di Yi Zengs. Per qualche ragione non ha menzionato che puoi usare nth-of-type con un nome di classe in cssSelector.Non è necessario passare attraverso un elenco di elementi per ottenere l'elemento Nth contenente il nome della classe –

+0

@Vlad: Grazie per aver segnalato. 'nth-of-type' è CSS3, che non era completamente supportato da Selenium sotto la cappa per tutti i browser in quel momento. Potrebbe essere supportato ora, ma non ho la possibilità di verificare. L'hai provato con l'ultimo selenio? –

0

By.cssSelector(".ban") o By.cssSelector(".hot") o By.cssSelector(".ban.hot") dovrebbero essere tutti selezionarlo a meno che non v'è un altro elemento che ha quelle classi.

In CSS, .name significa trovare un elemento che ha una classe con name. .foo.bar.baz significa trovare un elemento che abbia tutte quelle classi (nello stesso elemento).

Tuttavia, ciascuno di questi selettori selezionerà solo il primo elemento che corrisponde alla pagina. Se hai bisogno di qualcosa di più specifico, per favore pubblica l'HTML degli altri elementi che hanno queste classi.

+0

lo apprezzano Guys! – ktmrocks

0

Si può descrivere la tua selezione css come dows foglio di stile CSS:

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