2017-10-21 124 views
6

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

一旦上傳,它應該看起來像這樣它要求從下拉列表中選擇。

enter image description here

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) 

+1

你能分享你的Selenium代碼嗎?另外,你能否格式化你的HTML代碼,對齊它,如果可能的話,只需要對你的問題重要的部分? – Tom

+1

你可以發佈你的代碼到目前爲止你嘗試了什麼所以我們可以指出你的代碼有什麼問題。如果可能的話,請分享該網站的URL – NarendraR

+0

我更新了代碼,使其更加簡單直接。我正在使用的鏈接是https://demos5.softaculous.com/Mautic/s/contacts/import/new – JamesRocky

回答

3

看着你所提供的HTML,該WebElementid="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的。

+0

它好像當我嘗試並執行它,它不會選擇 – JamesRocky

+1

@JamesRocky我的回答是,以幫助您選擇類。它必須沒有任何失敗的工作。你想選擇哪個選項?你看到什麼錯誤?你能用你當前的代碼和完整的錯誤堆棧跟蹤來更新問題嗎? – DebanjanB

+0

我已更新帖子。感謝您的幫助。 – JamesRocky

4

我試圖手動複製你的代碼的步驟,但是當我加載data_file.csv和我點擊上傳按鈕:

enter image description here

沒有任何反應。

而且,在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);。這不是確定性的。您必須使用明確的等待

Explicit Waits

一個明確的等待是你定義等待某個條件 代碼,然後再繼續發生代碼。 的極端情況是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 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(); 
+0

嗨,感謝您的評論。我只注意到上傳.CSV文件不起作用。我實際上正在運行該服務的本地版本,它應該工作。你可以在這裏下載軟件並在本地運行:https://www.mautic.org/m/asset/54:mautic-2100 – JamesRocky

+0

@JamesRocky我剛剛編輯了答案。 –

+0

這有效嗎?我已經試過這個,可悲的是它沒有導致下拉選擇,並給出了這個錯誤「線程中的異常」主要「org.openqa.selenium.NoSuchElementException:沒有這樣的元素:無法找到元素:{」method「 :「xpath」,「selector」:「// div [@ class ='choice-wrapper'] // div [@ id ='lead_field_import_email_address_chosen']」}' – JamesRocky

相關問題