2016-08-15 2 views
1

Я прочитал ответы на похожие вопросы о stackoverflow, но ни один из ответов не работает для меня. Конкретная разница в большинстве ответов - это обратный вызов javascript в элементе select. Я попытался выделить объект, локаторы с использованием индекса, значения и текста, никто не будет выбрать правильный вариант, все из-за яваскрипт обратного вызова Я считаюSelenium не выбирает вариант выбора из-за обратного вызова javascript

Это элемент Я пытаюсь выбрать из:

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

Вот мой код:

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

альтернативный подход без разницы в результатах:

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(); 

Прежде чем вы ответите, я должен щелкнуть оба из них в соответствии с другими, поскольку обратный вызов, кажется, обманет объект Select, таким образом, явные щелчки и локаторы XPath.

Отбор выберите контрольных работ в обоих случаях, то выбор варианта, кажется, работает, но щелчок мыши не заставит его выбирать.

Я попробовал вариант ниже для JavaScript, тот же вопрос

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(); 

Сайт не является общедоступным, и я не имею никакого контроля над ним. Обратите внимание, что initMouseEvent, как указано в приведенном ниже решении, не содержит всех необходимых аргументов. Я думаю, что я прав. initMouseEvent также устарел.

Первоначально я использовал Selenium IDE для записи действий. Вот как она экспортирует его для Java:

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

После прочтения этого - Preserve onchange for a dropdown list when setting the value with Javascript

Я попробовал это (также с функцией недекорированного с окном префиксом):

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

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

Но получить это :

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

Идеи?

+0

Вы пытались использовать класс 'Select'? И если вы попробовали, можете ли вы поделиться им? –

+0

У вас будет возможность повторить эту проблему по общедоступному URL? –

ответ

1

Селен обеспечивает Select класс, чтобы иметь дело с выпадающий ниже методами:

WebElement el = driver.findElement(By.id("ctl0")); 
Select select = new Select(el); 
  • Использование selectByIndex(), как показано ниже:

    select.selectByIndex(1); 
    
  • Использование selectByValue(), как показано ниже:

    select.selectByValue("1"); 
    
  • Использование selectByVisibleText(), как показано ниже:

    select.selectByVisibleText("Option 1"); 
    

Примечание: Я хотел бы предложить вам попробовать использовать один из них выше способа, чтобы выбрать вариант из выпадающего списка вместо того, чтобы использовать .click()

Отредактировано: Если, к сожалению, выше методы не работают, вы можете попробовать использовать JavascriptExecutor, как показано ниже: -

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

Да, я полностью осознаю это, как указано в моем первоначальном вопросе. Но подход «Выбор» не работал, как описано в моем обновленном вопросе. – csDave

+0

@csDave Хорошо, вы можете попробовать использовать JavascriptExecutor, а затем ..try обновленный ответ и дайте мне знать –

+0

Я пробовал, без разницы. Может быть, это проблема Firefox на Ubuntu? – csDave

Смежные вопросы