2013-08-17 9 views
26

Chcę znaleźć element ten link „USA” w <h5>. Próbuję tego w Craigslist. Każda pomoc będzie bardzo mile widzianeTrzeba znaleźć element selenu przez css

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

Odpowiedz

62

Tylko używanie nazw klas nie jest wystarczające w twoim przypadku.

  • By.cssSelector(".ban") ma 15 pasujące węzły
  • By.cssSelector(".hot") ma 11 pasujące węzły
  • By.cssSelector(".ban.hot") posiada 5 pasujące węzły

Dlatego trzeba więcej ograniczeń, aby sprowadzić. Opcje 1 i 2 poniżej są dostępne dla selektora css, 1 może być tym, który najlepiej odpowiada Twoim potrzebom.

Opcja 1: Użycie indeksu elementów listy (CssSelector lub XPath)

Ograniczenia

  • mało stabilny, jeśli struktura witryny zmienia

Przykład:

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

Opcja 2: przy użyciu Selenium FindElements, a następnie zindeksuj je.(CssSelector lub XPath)

Ograniczenia

  • mało stabilny, jeśli struktura witryny zmienia
  • Nie sposób natywny selektora

Przykład:

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

Opcja 3: Korzystanie z tekstu (tylko XPath)

Ograniczenia

  • Nie dla witryn wielojęzycznych
  • Tylko dla XPath, nie dla CssSelector selen za

Przykład:

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

Wariant 4: Wskaźnik zgrupowane selektor (XPath tylko)

Ograniczenia

  • mało stabilny, jeśli struktura witryny zmienia
  • Tylko dla XPath, nie CssSelector

Przykład:

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

Wariant 5: Znajdź ukryte listy przedmiotów Link przez href, a następnie przechodzić z powrotem do h5 (tylko XPath)

Ograniczenia

  • Tylko dla XPath, nie CssSelector
  • Niska wydajność
  • Tricky XP ATH

Przykład:

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

Jest to dodatek do odpowiedzi Yi Zengsa. Z jakiegoś powodu nie wspomniał, że możesz użyć nth-of-type z nazwą klasy w cssSelector.Nie musisz przechodzić przez listę elementów, aby uzyskać N-ty element zawierający nazwę klasy. –

+0

@Vlad: Dzięki za wskazanie. 'nth-of-type' to CSS3, który nie był w pełni obsługiwany przez Selenium pod maską dla wszystkich przeglądarek w tym czasie. To może być teraz obsługiwane, ale nie mam szansy na weryfikację. Czy przetestowałeś go z najnowszą Selenium? –

0

By.cssSelector(".ban") lub By.cssSelector(".hot") lub By.cssSelector(".ban.hot") powinniśmy je wybrać, chyba że istnieje inny element, który ma te zajęcia.

W CSS, .name oznacza znaleźć element, który ma klasę z name. .foo.bar.baz oznacza znalezienie elementu, który ma wszystkie te klasy (w tym samym elemencie).

Jednak każda z tych selektorów wybierze tylko pierwszy element, który pasuje go na stronie. Jeśli potrzebujesz czegoś bardziej konkretnego, opublikuj kod HTML innych elementów, które mają te klasy.

+0

Doceń to chłopaki! – ktmrocks

0

Możesz opisać swój wybór css jak arkusz stylów kaskadowych Dows:

protected override void When() 
{ 
    SUT.Browser.FindElements(By.CssSelector("#carousel > a.tiny.button")) 
} 
Powiązane problemy