Я прочитал ответы на похожие вопросы о 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)
Идеи?
Вы пытались использовать класс 'Select'? И если вы попробовали, можете ли вы поделиться им? –
У вас будет возможность повторить эту проблему по общедоступному URL? –