无法在Java Selenium中选择引导程序下拉列表
我在Selenium中选择引导程序下拉列表非常困难。无法在Java Selenium中选择引导程序下拉列表
我是新来的Selenium,所以任何建议和指导都会非常有帮助,因为我喜欢做的只是选择下拉列表,然后输入“email”,然后在实例中按回车键。
我已经经历了几十种解决方案,但他们都没有为这个特定的问题工作。
我该怎么办?请帮忙。
Salenium
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 {
\t public static void main(String args[]) throws Exception {
\t \t
\t \t 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();
\t }
}
这里是链接到数据文件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_address')"));
这样的:
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)
看着你所提供的HTML
,该WebElement
与id="lead_field_import_email_address"
是在Select
标签。因此,而不是在这种情况下使用Actions
类,我们应该尝试使用Select
类代替如下:
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
@JamesRocky我的回答是,以帮助您选择类。它必须没有任何失败的工作。你想选择哪个选项?你看到什么错误?你能用你当前的代码和完整的错误堆栈跟踪来更新问题吗? – DebanjanB
我已更新帖子。感谢您的帮助。 – JamesRocky
我试图手动复制你的代码的步骤,但是当我加载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);
EDIT 2
你的问题是,你为了等待的元素中使用Thread.sleep(XXXX);
。这不是确定性的。您必须使用明确的等待。
一个明确的等待是你定义等待某个条件 代码,然后再继续发生代码。 的极端情况是time.sleep(),它将条件设置为准确的时间段 等待。有一些便利的方法可以帮助你编写只会根据需要等待的代码。 WebDriverWait在 与ExpectedCondition的组合是可以实现的 的一种方式。
所以,在Java中,你需要:
这最多等待15秒抛出一个TimeoutException除非 它找到的元素返回前:
从以前的链接WebDriverWait wait = new WebDriverWait(driver, 15); WebElement we=wait.until(ExpectedConditions.elementToBeClickable(By.id("lead_field_import_email_address_chosen")));
始终在15秒内。 WebDriverWait 默认每500毫秒调用一次ExpectedCondition,直到它成功返回 。 ExpectedCondition成功返回 类型为布尔值返回值为true或非null返回值为所有其他 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);
EDIT 3
与Firefox,上面的代码(在我的测试)是确定。我注意到你使用Chrome。使用Chrome,我有this problem。 solution适合我:
//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文件不起作用。我实际上正在运行该服务的本地版本,它应该工作。你可以在这里下载软件并在本地运行:https://www.mautic.org/m/asset/54:mautic-2100 – JamesRocky
@JamesRocky我刚刚编辑了答案。 –
这有效吗?我已经试过这个,可悲的是它没有导致下拉选择,并给出了这个错误“线程中的异常”主要“org.openqa.selenium.NoSuchElementException:没有这样的元素:无法找到元素:{”method“ :“xpath”,“selector”:“// div [@ class ='choice-wrapper'] // div [@ id ='lead_field_import_email_address_chosen']”}' – JamesRocky
你能分享你的Selenium代码吗?另外,你能否格式化你的HTML代码,对齐它,如果可能的话,只需要对你的问题重要的部分? – Tom
你可以发布你的代码到目前为止你尝试了什么所以我们可以指出你的代码有什么问题。如果可能的话,请分享该网站的URL – NarendraR
我更新了代码,使其更加简单直接。我正在使用的链接是https://demos5.softaculous.com/Mautic/s/contacts/import/new – JamesRocky