2017-07-10 8 views
1

Ich bin neu bei Selenium. Ich versuche mit einem Website-Kalender umzugehen.Selenium Webdriver/Java: Handhabung Kalender

Wenn ich den unten angezeigten Code ausführen, wird "date did not match" (else Zweig) zurückgegeben. Wenn ich die contains-Funktion anstelle von equalsignorecase verwende, wird 12 th-Datum statt 31 ausgewählt.

Die Website, die ich versuche, automatisch zu testen ist https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335. Kann jemand helfen?


public void logged_in_user_booking() throws InterruptedException 
{ 
    calender.click(); 
    Thread.sleep(4000); 
    List<WebElement> dates= driver.findElements(By.cssSelector(".days")); 

    System.out.println(dates); 
    for(int i=0; i<dates.size(); i++) 
    { 
     datee = dates.get(i).getText(); 
     if(datee.equalsIgnoreCase("31")) 
     { 

      dates.get(i).click(); 
      break; 
     } 
     else 
     { 
      System.out.println("date did not match"); 
     }  
    } 
} 
+0

Was erwarten Sie von dem Ergebnis? Ihr aktueller Selektor gibt nur 1 'WebElement' zurück. Was Sie suchen, ist 'Liste dates = driver.findElements (By.cssSelector (" ul.days li "));'. Die folgenden Schritte enthalten auch einige Probleme. Übrigens muss sich deine Logik auch ändern: Was wirst du tun, wenn dein Monat '! = 31' Tage hat? :) – iamdanchiv

+0

Vielen Dank es funktioniert jetzt. Für den Fall! = 31 wähle ich 30 else 28 (feb). @iamdantschiw. Ich habe gerade mit Selen angefangen, ich übe nur für jetzt –

+0

Froh, dass es funktioniert SUMIT! Ja, Sie könnten eine switch-Anweisung versuchen, um Ihre Ausnahmen zu behandeln. Aber letztendlich versuchen Sie einfach, auf den letzten Tag des Monats zu klicken, oder? Es gibt bessere Wege, dies zu erreichen. Prost! – iamdanchiv

Antwort

0

OK, so haben wir vereinbart, dass die EASY/QUICKFIX die gesamte Liste der <li> Datum WebElement s (z.B .: Tage) zu erhalten war: List<WebElement> dates= driver.findElements(By.cssSelector("ul.days li"));.

Dies ist jedoch nicht die beste Lösung für Ihr Problem. Selen zu lernen ist eine angenehme Erfahrung, besonders wenn es richtig gemacht wird. Der größte Teil der Herausforderung kommt aus dem Verständnis warum, wie und wenn einen bestimmten Typ von Selektor wählen.

Problem: Wählen Sie das letzte Datum aus dem Kalender Widget.

Ihre Lösung: Looping durch die Tage WebElements des Kalenders und die Suche nach dem einen, das am letzten Tag enthält (z: 31).

Optimale Lösung: Mit einem xpath-selector, die für dieses Szenario besser geeignet ist, da sie die Notwendigkeit beseitigt durch Ihre gesamte Liste der monatlichen Tage zu wiederholen.

So sollte unser xpath-Selektor sein: //ul[contains(@class, "days")]/li/span[text() = 31]. Siehe unten eine Schritt-für-Schritt-Zusammenbruch, wie ich kam zu diesem Ergebnis die Browser-Konsole:

enter image description here

Ihr Code nun wie folgt aussehen:

public void logged_in_user_booking() throws InterruptedException 
{ 
    calender.click(); 
    Thread.sleep(4000); 
    List<WebElement> lastDay= driver.findElements(By.xpath("//ul[contains(@class, "days")]/li/span[text() = 31]")); 

    lastDay.click(); 
} 

Sieht besser aus, oder ?! :)

Nächste Schritte: Nun, da Sie wissen, wie ein bestimmtes Element auf Text basiert auf Ziel XPath verwenden, können Sie Ihr Programm Feinabstimmung für die Ausnahmen zu überprüfen: 28, 30 usw.

Ich hoffe, es hat dir geholfen. Prost!

0

Da Sie Selen lernen, würde ich ein paar Dinge vorschlagen:

  1. Wenn Sie Code schreiben, die eine Funktion wahrscheinlich wieder verwendet werden, schreiben. Einen Tag auf einer Website wie diesem zu picken, wird wahrscheinlich immer und immer wieder verwendet. Denken Sie darüber nach, welche Aktionen wahrscheinlich auf der Seite wiederholt werden und schreiben Sie Funktionen für jede Seite. In diesem einfachen Fall würde ich einen Tag als String aufnehmen und den entsprechenden Tag anklicken.

    public static void setDay(String day) 
    { 
        driver.findElement(By.id("calendar")).click(); 
        By dayLocator = By.xpath("//ul[@class='days']/li/span[.='" + day + "']"); 
        new WebDriverWait(driver, 3).until(ExpectedConditions.visibilityOfElementLocated(dayLocator)).click(); 
    } 
    

    Nennen Sie es, wie

    driver.get("https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335"); 
    setDay("31"); 
    
  2. Verwenden Thread.Sleep() nicht. Ich werde nicht auf alle Details eingehen, da Sie viele Gründe dafür finden, etwas zu googeln, aber es ist eine schlechte Übung. Verwenden Sie stattdessen eine explizite Wartezeit, WebDriverWait. Schauen Sie in ExpectedConditions und sehen Sie all die verschiedenen eingebauten Dinge, auf die Sie warten können, und verwenden Sie sie wann immer nötig. Manchmal musst du clever sein, auf was du wartest, aber es gibt fast immer etwas.

  3. Lernen Sie CSS-Selektoren und XPath. Sie sind beide sehr leistungsfähig ... bevorzugen aber CSS-Selektoren, weil sie schneller und besser unterstützt werden. XPath eignet sich in erster Linie dazu, ein Element zu finden, das auf enthaltenem Text basiert, da CSS-Selektoren das nicht können.

    CSS Selectors reference

    CSS Selectors tips

    Advanced CSS Selectors

Für Bonuspunkte ... schreiben die Funktion:

  1. nehmen einen Date Parameter
  2. ziehen Sie den Tag, den Monat und das Jahr
  3. und wählen Sie das richtige Datum

Es sollte einen Monat aus einem anderen Jahr/Monat auswählen kann.