2016-08-15 2 views
1

Ich habe Antworten auf ähnliche Fragen auf Stackoverflow gelesen, aber keine der Antworten funktionieren für mich. Der Unterschied zu den meisten Antworten ist der Javascript-Callback im Select-Element. Ich habe Select-Objekt versucht, Locators mit Index, Wert und Text, keiner wird die richtige Option auswählen, werden alle aufgrund des Javascript Rückruf glaube ichSelen nicht auswählend Option wegen Javascript Rückruf

Dies ist das Element, das ich wählen versuche aus:

<select name="ctl0" onchange="javascript:setTimeout('__doPostBack(\'ctl0\',\'\')', 0)" id="ctl0" style="width:205px;margin-left:30px;"> 
    <option value="0">Option 0</option> 
    <option selected="selected" value="1">Option 1</option> 
    <option value="2">Option 2</option> 

</select> 

Hier ist mein Code:

driver.findElement(By.id("ctl0")).click(); 
driver.findElement(By.xpath("//select[@id=\"ctl0\"]/option[@value=\"1\"]")).click(); 

Ein alternativer Ansatz ohne Unterschied im Ergebnis:

driver.findElement(By.id("ctl0")).click(); 
Select select = new Select(driver.findElement(By.id("ctl0"))); 
WebElement elem = select.getOptions().get(1); 
System.out.println(elem.getText()); 
elem.click(); 

Bevor Sie antworten, muss ich auf beide entsprechend klicken, weil der Callback scheinbar ein Select-Objekt täuscht, also den expliziten Klick und XPath-Locator.

Die Auswahl der wählen Kontrolle funktioniert in beiden Fällen, die Auswahl der Option scheint zu funktionieren, aber der Klick führt nicht sie ausgewählt werden.

habe ich versucht, die Option unten für Javascript, gleiches Problem

WebElement el = driver.findElement(By.id("ctl0")); 
    String jsScript = "showDropdown = function (element) " 
      + "{" 
      + " var event; " 
      + " event = document.createEvent('MouseEvents'); " 
      + " event.initMouseEvent('mousedown', true, true, window, 1, 0,0,0,0,false,false,false,false,0,null); " 
      + " element.dispatchEvent(event); " 
      + "}; " 
      + "showDropdown(arguments[0]);"; 

    ((JavascriptExecutor)driver).executeScript(jsScript,el); 

    WebElement elem = el.findElement(By.xpath(".//option[@value = '1']")); 
    System.out.println("Option visible text is " + elem.getText()); 
    elem.click(); 

Die Seite ist nicht öffentlich, und ich habe keine Kontrolle darüber. Beachten Sie, dass das in der folgenden Lösung angegebene initMouseEvent nicht über alle erforderlichen Argumente verfügt. Ich denke, ich habe sie richtig gemacht. initMouseEvent ist jetzt ebenfalls veraltet.

Ich hatte ursprünglich Selenium IDE verwendet, um die Aktionen aufzuzeichnen. Dies ist, wie es sie für Java exportiert:

new Select(driver.findElement(By.id("ctl0"))).selectByVisibleText("Option 1"); 
driver.findElement(By.cssSelector("option[value=\"1\"]")).click(); 

nach der Lektüre dieses - Preserve onchange for a dropdown list when setting the value with Javascript

ich schon versucht, diese (auch mit der Funktion undecorated mit Fenstern Präfix):

new Select(driver.findElement(By.id("ctl0"))).selectByValue("1"); 
    String jsScript = "window.__doPostBack(arguments[0],'');"; 

    ((JavascriptExecutor)driver).executeScript(jsScript,"ctl0"); 

Aber bekommen diese :

org.openqa.selenium.WebDriverException: TypeError: window.__doPostBack is not a function (WARNING: The server did not provide any stacktrace information) 

Ideen?

+0

Haben Sie versucht, 'Select' Klasse zu verwenden? Und wenn versucht, könntest du es auch teilen ?? –

+0

können Sie dieses Problem auf einer öffentlichen URL replizieren? –

Antwort

1

Selen bietet Select Klasse mit Drop-Down mit folgenden Methoden umgehen:

WebElement el = driver.findElement(By.id("ctl0")); 
Select select = new Select(el); 

Hinweis: Ich würde vorschlagen, versuchen Sie eine dieser oben genannten Verfahren unter Verwendung von Drop-Down-Auswahl Option statt mit .click()

Editiert: Wenn die obigen Methoden leider nicht funktionieren, können Sie versuchen, JavascriptExecutor wie folgt zu verwenden: -

WebElement el = driver.findElement(By.id("ctl0")); 

((JavascriptExecutor)driver).executeScript("showDropdown = function (element) {var event; event = document.createEvent('MouseEvents'); event.initMouseEvent('mousedown', true, true, window); element.dispatchEvent(event); }; showDropdown(arguments[0]);",el); 

el.findElement(By.xpath(".//option[@value = '1']").click(); 
+0

Ja, ich bin mir dessen bewusst, wie in meiner ursprünglichen Frage ausgeführt. Aber der Select-Ansatz funktionierte nicht wie in meiner aktualisierten Frage beschrieben. – csDave

+0

@csDave Ok, Sie können versuchen mit 'JavascriptExecutor' dann..try aktualisierte Antwort und lassen Sie mich wissen –

+0

Ich habe es versucht, keinen Unterschied. Vielleicht ist es der Firefox auf Ubuntu, der das Problem ist? – csDave