2016-07-07 12 views
0

Ich habe Schwierigkeiten bei der Auswahl von Optionen aus einer Dropdown-Liste mit SeleniumWebdriver. Unten sind die HTML Schnipsel:Unable bekommen Optionen von einem Wählen Sie mit Selenium

<span id="id14"> 
    <div class="stadium-input-row"> 
     <span class="inputContainer"> 
      <select id="id1f" class="departurePoint stadiumSelect" onchange="var wcall=.........."> 
      <option value="">Please select</option> 
      <option value="BHX"> Birmingham - (BHX) </option> 
      <option value="GLA"> Glasgow - (GLA) </option> 
      <option value="LON"> London - (LON) </option> 
      <option value="MAN"> Manchester - (MAN) </option>............ 

Der select-Tag id jedes Mal ändert, das DOM geladen wird.

Das Auswahl-Tag ist ausgegraut, bis es interagiert.

Mein Code

Select oSelect = new Select(driver.findElement(By.xpath("(.//select)[1]")); 
oSelect.selectByVisibleText("Birmingham"); 

Fehler

org.openqa.selenium.NoSuchElementException: orten kann nicht Element mit dem Text: Birmingham

Im Debug-Modus, funktioniert der Drop-Down nicht scheinen vom Fahrer aktiviert (angeklickt) zu sein.

+0

Verwenden '.selectByVisibleText ("Birmingham - (BHX)");' wie mein vorgesehen answer..it funktioniert für mich ... –

+0

leider funktioniert das nicht, wenn das Element nicht sichtbar ist – Steerpike

+0

Aber nach Ihrer Ausnahme scheint es wie Selen finden Sie die Auswahlbox, aber konnte nicht die Option von bereitgestellten Text .. –

Antwort

1

Es gibt ein seltsam (zumindest ist es seltsam für mich), was auf dieser Website geht. Die SELECT, auf die Sie zugreifen möchten, ist permanent ausgeblendet (was bedeutet, dass Sie nicht mit Selenium interagieren können). Benutzer interagieren mit DIV s, etc. über ein gefälschtes Dropdown (es ist kein SELECT) und das Ergebnis dieser Auswahlen werden in der versteckten SELECT gespeichert.Es gibt zwei Möglichkeiten, um Ihre Aufgabe zu erfüllen.

  1. Behandeln Sie, was Sie sehen können.

    Das ist wirklich ein Schmerz auf dieser Seite. Ich denke, es kann letztendlich getan werden, aber ich möchte nicht mehr selbst Zeit damit verbringen, also zeige ich dir die Tür und du musst dort weitermachen, wo ich aufgehört habe. Der folgende Code öffnet das Abfahrtsdropdown. Von dort aus finden Sie den Abflughafen und klicken darauf. Erledigt. Schwieriger als es klingt ...

    driver.findElement(By.cssSelector("div.custom-select.departurePoint.airportSelect")).click(); 
    
  2. Cheat und verwenden JavascriptExecutor.

    HINWEIS: Dadurch führen Sie kein echtes Benutzerszenario mehr aus, da Benutzer nicht auf verborgene Elemente klicken oder Javascript-Befehle in die Seite einfügen können. Solange Sie damit einverstanden sind, hier ein Beispiel.

    Dieser Code führt Javascript auf der Seite mit der JavascriptExecutor. Sie übergeben der Funktion eine Zeichenfolge, nach der Sie in den Optionen suchen, z. Sie können "EMA" oder "East Midlands - (EMA)" oder irgendwo dazwischen passieren. Der JS-Code wird den versteckten SELECT-Code erfassen, die OPTIONEN durchsuchen und den ersten passenden auswählen.

    Hinweis: Die Benutzeroberfläche wird nicht mit der Auswahl aktualisiert. Sobald Sie auf SUCHEN klicken, wird es funktionieren. Ich habe es selbst ausprobiert und es funktioniert.

    Noch ein Hinweis: Ich benutze Eclipse als mein Editor, so dass die Sie in den folgenden Code sehen Eclipse von Wrapping/Neuformatierung der extra langen Zeichenfolge, die den JS-Code enthält. Sie können es lassen oder entfernen, wie Sie möchten. Ich mag es dort, weil ich den JS-Code immer noch so formatiert und eingerückt lesen kann, wie es ist, und ich möchte nicht, dass Eclipse es kaputt macht.

    selectOption("EMA"); 
    
    public void selectOption(String option) 
    { 
        // @formatter:off 
        String script = 
         "function selectOption(s) {\r\n" + 
         " var sel = document.querySelector('select.departurePoint.airportSelect');\r\n" + 
         " for (var i = 0; i < sel.options.length; i++)\r\n" + 
         " {\r\n" + 
         "  if (sel.options[i].text.indexOf(s) > -1)\r\n" + 
         "  {\r\n" + 
         "   sel.options[i].selected = true;\r\n" + 
         "   break;\r\n" + 
         "  }\r\n" + 
         " }\r\n" + 
         "}\r\n" + 
         "return selectOption('" + option + "');"; 
    
        // @formatter:on 
        ((JavascriptExecutor) driver).executeScript(script); 
    } 
    
+0

Ich habe eine Hassliebe mit Fragen wie dieser. Ich liebe den Puzzle-Aspekt, aber ich hasse manchmal, wie lange es braucht, um sie herauszufinden. Also, du verbesserst diese 500x, nimmst sie als Antwort an und stellst mir deinen Erstgeborenen für all die Arbeit zur Verfügung, die ich in dieser Sache gemacht habe ... lol. – JeffC

+0

Ich komme auf dieses Problem nach einer langen Pause zurück. Die Lösung, die Sie gegeben haben (Javascript Executor) * hat * funktioniert, aber jetzt kann ich es nicht funktionieren lassen. vielleicht übergebe ich den falschen CSS-Selektor an den Code? Ich gebe select.selection-component weiter, aber das ist nicht ganz richtig, denke ich, weil die Seite beim Klicken auf "Suchen" aktualisiert wird und keine Suche durchführt. Dies ist auf https://www.club18-30.com/club18-30 – Steerpike

0

Als Ihr exception klar sagt Cannot locate element with text: Birmingham bedeutet es mit ganzen sichtbaren Text Option vergleicht, so dass Sie wie unten versuchen sollte: -

WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement select = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(.//select)[1]"))); 
Select oSelect = new Select(select); 
oSelect.selectByVisibleText("Birmingham - (BHX)"); 

oder

oSelect.selectByIndex(1); 

oder

oSelect.selectByValue("BHX"); 

Bearbeitet: - Wenn leider keine der oben genannten Lösung funktioniert, sollten Sie mit JavascriptExecutor wie unten probieren: -

((JavascriptExecutor)driver).executeScript("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text.indexOf(arguments[1]) != -1){ select.options[i].selected = true; } }", 
      driver.findElement(By.xpath("(.//select)[1]")), 
      "Birmingham"); 

Hoffe, es wird Ihnen helfen .. :)

0

, was Sie tun müssen:

List<WebElement> options = driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")).findElements(By.tagName("option")); 

dass erstellen Sie die Liste von Option-Tags als WebElement

oder

Objekte

oder nehmen Sie nur den wählen als WebElement Objekt

WebElement selectElement = driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")); 

Element Schwebend

Actions action = new Actions(driver); 
WebElement hoverElement = driver.findElement(By.xpath("//div[@class='stadium-input-row']//select")); 
action.moveToElement(hoverElement); 
action.click().build().perform(); 
+0

Mit der ersten Methode erstellt es tatsächlich eine Liste von Tags, weil ich beim Debuggen 41 Elemente in der Liste sehen kann. Das Problem, das ich habe, ist, ein Element Selenium auszusetzen, damit es mit ihm interagieren kann. Wenn ich zum Beispiel: options.get (1) .click mache, bekomme ich immer noch eine org.openqa.selenium.ElementNotVisibleException mit jeder vorgeschlagenen Methode. – Steerpike

+0

versuchen, auf der Auswahl zu schweben und danach interagieren mit - ich werde den Code hinzufügen –

+0

das Dropdown ist nicht aktiviert, bei Hover, sondern auf – Steerpike

-1

Wählen Sie nicht die Situationen, in allen. Versuchen Sie diesen Code

List <WebElement> options = driver.findElements(By.xpath("Target Element with Options")); 
    String element; 
    for(int i=0;i<options.size();i++) 
    { 
     element = options[i].get(i).getAttribute("value"); 
     if(element.equals("BHX")){ 
      options.get(i).click(); 
     } 
    } 
Verwandte Themen