无法 select Internet Explorer 中动态 webtable 下拉列表中的值

Unable to select a value from dropdown inside dynamic webtable in Internet Explorer

我正在尝试单击位于动态网络表格内的网页中的下拉菜单。

我尝试使用 driver.findelement、actions.movetoElement、javascript 机器人按键定位并 select 一个选项,但没有成功。

public void selectFromDropDown(String value) throws Exception
{

List<WebElement> elem = driver.findElements(By.xpath("//tbody[@id='tbodyAlternateIds']//select"));
        for(int i=1;i<elem.size()-1;i++) {
            System.out.println("Element Size>>>>>>>>" + elem.size());
            WebElement Identifiers = driver.findElement(By.xpath("//select[@id='alternateIds["+i+"].type.description']"));
            Select select = new Select(Identifiers);
            if(select.getFirstSelectedOption().getText().isEmpty()) {
                if(!(select.getFirstSelectedOption().getAttribute("value").equalsIgnoreCase(value))){
                    JavascriptExecutor js = (JavascriptExecutor) driver;
                    js.executeScript("document.getElementById('alternateIds["+i+"].type.description').value = "+value+";");
                }
            }

        }

    }

我的 DOM 如下所示


<SELECT id=alternateIds[2].type.description class=smalltext name=alternateIds[2].type.code value=""> 
<OPTION selected></OPTION> 
<OPTION value=AML>AML</OPTION> 
<OPTION value=ALC>Alacra ID</OPTION> 
<OPTION value=BOS>BOSS</OPTION> 
<OPTION value=BKA>Bankers Almanac ID</OPTION> 
`
`
`
`

</SELECT>

日志报错信息如下:

org.openqa.selenium.JavascriptException: JavaScript error (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
Build info: version: '3.5.3', revision: 'a88d25fe6b', time: '2017-08-29T12:42:44.417Z'
System info: host: 'VKRDAP0009714', ip: '30.206.79.17', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_202'
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
Capabilities [{browserAttachTimeout=0, enablePersistentHover=false, ie.forceCreateProcessApi=false, pageLoadStrategy=normal, unhandledPromptBehavior=dismiss, ie.usePerProcessProxy=false, ignoreZoomSetting=false, handlesAlerts=true, version=11, platform=WINDOWS, nativeEvents=true, ie.ensureCleanSession=false, elementScrollBehavior=0, ie.browserCommandLineSwitches=, requireWindowFocus=true, browserName=internet explorer, initialBrowserUrl=http://localhost:45547/, takesScreenshot=true, javascriptEnabled=true, ignoreProtectedModeSettings=false, platformName=WINDOWS, enableElementCacheCleanup=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=dismiss}]
Session ID: f0f347a8-b5c6-4bf1-bd89-576498a53872
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)
    at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:82)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:45)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:646)
    at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:582)
    at com.bofa.ivv.application.driver.tandem.cucumber.step_definitions.CreateParty.selectFromDropDown(CreateParty.java:434)

select 中的 ID 是动态的。我可以单击“新建”按钮并继续处理下拉框列表。因此每个下拉框 ID 都按 [1]、[2] 等进行分类和递增... (alternateIds[1].type.description)

  1. 您需要用引号将 value 括起来,例如:

    js.executeScript("document.getElementById('alternateids[" + i + "].type.description').value='" + value + "'");
    
  2. 你为什么要参加这个 JavaScript 电话会议? Select.selectByValue() 函数具有相同的功能
  3. 考虑迁移您的测试以使用 Page Object Model design pattern