【问题标题】:Unable to select Bootstrap dropdown in Java Selenium无法在 Java Selenium 中选择 Bootstrap 下拉菜单
【发布时间】:2018-04-02 06:21:47
【问题描述】:

我很难在 Selenium 中选择引导下拉菜单。

我是 Selenium 的新手,所以任何建议和指导都会非常有帮助,因为我想做的只是选择下拉列表,输入“电子邮件”,然后在实例期间按 Enter。

我已经尝试了几十个解决方案,但没有一个对这个特定问题有效。

我能做什么?请帮忙。

package newPackage;


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;


public class importLeads {

	public static void main(String args[]) throws Exception {
		
		        System.setProperty("webdriver.chrome.driver", "C:\\Users\\David\\Downloads\\Notes\\WebDriver\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();

    //login to site
    driver.get("https://demos5.softaculous.com/Mautic/s/contacts/import/new");
    driver.manage().window().maximize();
    driver.findElement(By.id("username")).sendKeys("admin");
    driver.findElement(By.id("password")).sendKeys("password");
    driver.findElement(By.className("btn")).click();
    Thread.sleep(2000);

    //importing Data
    WebElement uploadBox = driver.findElement(By.id("lead_import_file"));
    uploadBox.sendKeys("C:\\Users\\David\\Downloads\\data_file.csv");
    driver.findElement(By.id("lead_import_start")).click();

    //Select from dropdown
    WebElement dropdownToggle = driver.findElement(By.xpath("id('lead_field_import_email_address')"));
    Actions cursor = new Actions(driver);
    cursor.moveToElement(dropdownToggle);
    cursor.click();
    cursor.perform();
    Thread.sleep(1000);
    WebElement weh = driver.findElement(By.id("lead_field_import_email_address_chosen"));

    Actions cursor2 = new Actions(driver);
    cursor2.moveToElement(weh);
    cursor2.click();

	}
}

这里是数据文件ufile.io/vy2ws的链接

要上传 .CSV 文件,您必须运行该软件的本地版本。下载地址:https://www.mautic.org/m/asset/54:mautic-2100

上传后,它应该看起来像这样,它要求从下拉列表中进行选择。

HTML

<div class="col-sm-4">
   <div class="row">
      <div class="form-group col-xs-12 ">
         <label class="control-label" for="lead_field_import_email_address">Email address</label>        
         <div class="choice-wrapper">
            <select id="lead_field_import_email_address" name="lead_field_import[email_address]" class="form-control" autocomplete="false" style="display: none;">
               <option value=""></option>
               <optgroup label="Contact">
                  <option value="email">Email</option>
               </optgroup>
            </select>
            <div class="chosen-container chosen-container-single chosen-with-drop chosen-container-active" style="width: 100%;" title="" id="lead_field_import_email_address_chosen">
               <a class="chosen-single chosen-default">
                  <span>Choose one...</span>
                  <div><b></b></div>
               </a>
               <div class="chosen-drop">
                  <div class="chosen-search"><input type="text" autocomplete="off"></div>
                  <ul class="chosen-results">
                     <li class="group-result">Contact</li>
                     <li class="active-result group-option" data-option-array-index="9" style="">Email</li>
                  </ul>
               </div>
            </div>
         </div>
      </div>
   </div>
</div>

更换:

WebElement dropdownToggle = driver.findElement(By.xpath("id('lead_field_import_email_add‌​ress')")); 

到这里:

WebElement dropdownToggle = driver.findElement(By.id("lead_field_import_email_address"))‌​;

导致:

Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 35535
Only local connections are allowed.
Oct 22, 2017 1:20:49 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"lead_field_import_email_address"}
  (Session info: chrome=61.0.3163.100)
  (Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.14393 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.6.0', revision: '6fbf3ec767', time: '2017-09-27T16:15:26.402Z'
System info: host: 'DAVID-PC', ip: '192.235.0.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_151'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{mobileEmulationEnabled=false, hasTouchScreen=false, platform=XP, acceptSslCerts=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, platformName=XP, setWindowRect=true, unexpectedAlertBehaviour=, applicationCacheEnabled=false, rotatable=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f), userDataDir=C:\Users\David\AppData\Local\Temp\scoped_dir4068_28713}, takesHeapSnapshot=true, pageLoadStrategy=normal, unhandledPromptBehavior=, databaseEnabled=false, handlesAlerts=true, version=61.0.3163.100, browserConnectionEnabled=false, nativeEvents=true, locationContextEnabled=true, cssSelectorsEnabled=true}]
Session ID: ee90469095e7b1121dc2e387d8e485e6
*** Element info: {Using=id, value=lead_field_import_email_address}
    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:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    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:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:586)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:356)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:402)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:348)
    at newPackage.importLeads.main(importLeads.java:31)

替换

WebElement dropdownToggle = driver.findElement(By.xpath("id('lead_field_import_email_address')"));
    Actions cursor = new Actions(driver);

WebElement element =  driver.findElement(By.id("lead_field_import_email_address"));
    Select select = new Select(element);

导致:

Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 32443
Only local connections are allowed.
Oct 23, 2017 1:36:09 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"lead_field_import_email_address"}
  (Session info: chrome=61.0.3163.100)
  (Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.6.0', revision: '6fbf3ec767', time: '2017-09-27T16:15:26.402Z'
System info: host: 'HOME-PC', ip: '192.235.0.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_151'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{mobileEmulationEnabled=false, hasTouchScreen=false, platform=XP, acceptSslCerts=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, platformName=XP, setWindowRect=true, unexpectedAlertBehaviour=, applicationCacheEnabled=false, rotatable=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f), userDataDir=C:\Users\David\AppData\Local\Temp\1\scoped_dir5416_25737}, takesHeapSnapshot=true, pageLoadStrategy=normal, unhandledPromptBehavior=, databaseEnabled=false, handlesAlerts=true, version=61.0.3163.100, browserConnectionEnabled=false, nativeEvents=true, locationContextEnabled=true, cssSelectorsEnabled=true}]
Session ID: 40cde314a5a76400aceff8b625b38e3c
*** Element info: {Using=id, value=lead_field_import_email_address}
    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:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    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:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:586)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:356)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:402)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:348)
    at newAutomation.importLeads.main(importLeads.java:33)

【问题讨论】:

  • 你能分享你的 Selenium 代码吗?另外,您能否格式化您的 HTML 代码,对齐它,如果可能的话,只保留对您的问题很重要的部分?
  • 你能发布你的代码吗?到目前为止你做了什么?所以我们可以指出你的代码有什么问题。如果可能,请分享网站网址
  • @JamesRocky 你的 data_file.csv 文件的内容是什么?
  • @JamesRocky但是格式到底是什么?我尝试按照您的代码上传文件,但什么也没发生
  • @Tom 谢谢你的建议。我更新了代码以显示我更新代码后得到的结果

标签: java twitter-bootstrap selenium selenium-webdriver


【解决方案1】:

查看您提供的HTML,带有id="lead_field_import_email_address"WebElement 包含在Select 标记中。因此,在这种情况下,我们应该尝试使用 Select 类,而不是使用 Actions 类,如下所示:

WebElement element =  driver.findElement(By.id("lead_field_import_email_address"));
Select select = new Select(element);

接下来,我们可以通过调用selectByIndex(n)selectByValue("value")selectByVisibleText("visible_text") 方法来选择options 中的任何一个。

【讨论】:

  • 似乎当我尝试实现它时,它没有被选中
  • @JamesRocky 我的答案是帮助您选择类。它必须正常工作而不会出现任何故障。您要选择哪个选项?您看到的错误是什么?你能用你当前的代码和完整的错误堆栈跟踪更新问题吗?
  • 我看了一下 url,但上传文件后我不确定你到底想在这里做什么WebElement dropdownToggle = driver.findElement(By.xpath("id('lead_field_import_email_address')"));。由于定位器没有识别出这样的元素,您看到的是NoSuchElementException。请在问题区域更新您的确切手动步骤。
  • 我已更新帖子以包含上传后应显示的内容。似乎在仔细检查之后,该服务没有正确上传它。我正在运行的是在本地机器上,因此您可以下载该软件并在上传时从那里测试它并提示您从下拉列表中进行选择:mautic.org/m/asset/54:mautic-2100
【解决方案2】:

我尝试手动复制您的代码步骤,但是当我加载 data_file.csv 并单击上传按钮时:

什么都没有发生。

而且,在 html 中,没有您尝试查找的元素:

WebElement dropdownToggle = driver.findElement(By.xpath("id('lead_field_import_email_address')"));

这就是我写this comment的原因。

我可以想象应该打开一些东西。来自信息:

  • 限制
  • 分隔符
  • 外壳
  • 逃跑

我可以假设您必须上传具有特定格式的文件。

编辑

在本地尝试它有效。 我不太了解您的这部分代码:

        //Select from dropdown
        WebElement dropdownToggle = driver.findElement(By.xpath("id('lead_field_import_email_address')"));
        Actions cursor = new Actions(driver);
        cursor.moveToElement(dropdownToggle);
        cursor.click();
        cursor.perform();
        Thread.sleep(1000);
        WebElement weh = driver.findElement(By.id("lead_field_import_email_address_chosen"));

        Actions cursor2 = new Actions(driver);
        cursor2.moveToElement(weh);
        cursor2.click();

如果您想从电子邮件下拉列表中进行选择,您可以使用 xpath:

WebElement we = driver.findElement(By.xpath("//div[@class='choice-wrapper']//div[@id='lead_field_import_email_address_chosen']"));

或者只是id:

WebElement we= driver.findElement(By.id("lead_field_import_email_address_chosen"));

并执行感兴趣的操作。

所以,例如:

    WebElement we= driver.findElement(By.id("lead_field_import_email_address_chosen"));
    we.click();
    we.sendKeys("email");
    we.sendKeys(Keys.ENTER);

编辑 2

您的问题是您使用 Thread.sleep(XXXX); 来等待元素。这不是确定性的。您必须使用显式等待

来自Explicit Waits

显式等待是您定义的等待特定条件的代码 在代码中进一步进行之前发生。的极端情况 这是 time.sleep(),它将条件设置为确切的时间段 等待。提供了一些方便的方法来帮助您 编写只等待所需时间的代码。 WebDriverWait in 与 ExpectedCondition 结合是一种方法 完成。

所以,在java中你需要:

WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement we=wait.until(ExpectedConditions.elementToBeClickable(By.id("lead_field_import_email_address_chosen")));

总是来自上一个链接:

这会在抛出 TimeoutException 之前等待最多 15 秒,除非 它会在 15 秒内找到要返回的元素。 WebDriverWait by 默认每 500 毫秒调用一次 ExpectedCondition,直到它 成功返回。成功返回是为 ExpectedCondition 类型为布尔返回真或非空返回值所有其他 ExpectedCondition 类型。

最后,整个代码:

        String geckoDriver = System.getProperty("pathTo/geckodriver";
        System.setProperty("webdriver.gecko.driver", geckoDriver);
        WebDriver driver= new FirefoxDriver();
        driver.get("http://localhost:8888/2.10.0/s/contacts/import/new");
        driver.findElement(By.id("username")).sendKeys("admin");
        driver.findElement(By.id("password")).sendKeys("password");
        driver.findElement(By.className("btn")).click();

        WebDriverWait wait = new WebDriverWait(driver, 15);

        WebElement uploadBox=wait.until(ExpectedConditions.elementToBeClickable(By.id("lead_import_file")));
        uploadBox.sendKeys("/pathTo/data_file.csv");
        driver.findElement(By.id("lead_import_start")).click();

        //Select from dropdown
        WebElement we=wait.until(ExpectedConditions.elementToBeClickable(By.id("lead_field_import_email_address_chosen")));
        we.click();
        we.sendKeys("email");
        we.sendKeys(Keys.ENTER);

编辑 3

使用 Firefox,上面的代码(在我的测试中)是可以的。我注意到您使用 Chrome。使用 Chrome,我有 this problemsolution 对我有用:

        //Select from dropdown
        WebElement we=wait.until(ExpectedConditions.elementToBeClickable(By.id("lead_field_import_email_address_chosen")));
        /*we.click();
        we.sendKeys("email");*/

        Actions actions = new Actions(driver);
        actions.moveToElement(we);
        actions.click();
        actions.sendKeys("email");
        actions.sendKeys(Keys.ENTER);
        actions.build().perform();

【讨论】:

  • 您好,感谢您的评论。我刚刚注意到上传 .CSV 文件对此不起作用。我实际上正在运行该服务的本地版本,它应该可以工作。您可以在这里下载软件并在本地运行:mautic.org/m/asset/54:mautic-2100
  • 这对你有用吗?我已经尝试过了,遗憾的是它没有选择下拉菜单并给出了这个错误Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class='choice-wrapper']//div[@id='lead_field_import_email_address_chosen']"}
  • 使用id导致这个错误Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"lead_field_import_email_address_chosen"}
  • @JamesRocky 我重新编辑了答案。您必须使用显式等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2017-03-23
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多