2017-06-15 38 views
3

我在BDD框架中构建了我的脚本。我尝试了几种方法来处理我正在测试的应用程序中使用的Bootstrap下拉菜单。如何在java-selenium中使用黄瓜bdd框架处理bootstrap下拉框

但没有运气。

如何使用我的框架为我的应用程序处理引导程序下拉列表?

UIAction类文件:

我编写这将常见的表现,我在另一个类在以往任何时候需要调用这个函数法对所有的UI操作。

因此,对于下拉列表,我尝试使用UIAction中编写的select方法,如下所示。

在UIAction类选择方法:

public class UIActions { 

public static void select(String UIName, String objTechName, String data) throws Exception{ 
     try{ 

      Log.info("Selecting item in Combo " + objTechName); 
      //driver.findElement(By.xpath(OR.getProperty(object))).sendKeys(data); 

      //final Select selectBox = new Select(driver.findElement(By.xpath(OR.getProperty(object)))); 
      final Select selectBox = new Select(driver.findElement(ObjectMap.getLocator(objTechName))); 

      //selectBox.selectByValue(data); 
      selectBox.selectByVisibleText(data); 
     }catch(Exception e){ 
      Log.error("Not able to Select an item --- " + e.getMessage()); 
      throw new UserDefinedException("<<< Unable to Select '" + data + "' in Field '" + UIName + "' >>> "+e.getMessage());   
      //DriverScript.bTestStepResult = false; 

      } 
     } 
} 

定义在单独的类对象:

public class ObjectsDefinition extends UIActions { 

    public static final String OBJ_Origin_DROPDOWN = "|xpath|//span[contains(text(),'BRANCH')]"; 

} 

呼吁stepdefinition类文件选择功能在我的框架的方法:

public class StepDefinitions extends UIActions { 

@And("^User captures Origin (.*)$") 

    public void User_captures_Origin(String arg7) throws Throwable { 

     UIActions.select("OBJ_Origin_DROPDOWN", VASTObjectsDefinition.OBJ_Origin_DROPDOWN, arg7); 
     //UIActions.driver.findElements(By.xpath("//span[contains(text(),'BRANCH')]")); 
     Thread.sleep(50);  
    } 
} 

当上面的代码不起作用时,我尝试按照博客1的建议处理引导下拉列表中,但是,这也因此未为我工作:

@And("^User captures Origin (.*)$") 
    public void User_captures_Origin(String arg7) throws Exception{ 

      // this is using action class to set focus on any element 
      // below line is just for clicking on perticular dropdownlist 

      WebElement ele= driver.findElement(By.xpath(".//*[@id='content']/div/div[1]/div[2]/div[1]/div[2]/div[2]/div/div/div/button")); 
     // To count the number of value in drop down 

     Actions act= new Actions(driver); 

     act.moveToElement(ele).perform(); 

     // below line xpath is to select the value 
     List<WebElement> Dropdownvalues= driver.findElements(By.xpath("//span[contains(text(),'BRANCH')]")); 

     int total_links=Dropdownvalues.size(); 

     System.out.println("Total values count are:"+total_links); 


     for(int i=0;i<total_links;i++){ 

      // To get the name of all links: 

      WebElement element=Dropdownvalues.get(i); 

      String dropdownvalues_names= element.getAttribute("innerHTML"); 
    // boolean status= element.isEnabled(); 

      // System.out.println("Links name are:"+links_names +"Link status is "+ status);  


      // To clicking on perticular link: 

         if (dropdownvalues_names.equalsIgnoreCase("BRANCH")){ 

          element.click(); 
          break; 


         } 

     } 


     // Actions act= new Actions(driver); 

     // act.moveToElement(ele).perform(); 

     // driver.findElement(By.xpath("//div[2]/div/select")).click(); 


     // new Actions(driver).moveToElement(ele).click().perform(); 



     Thread.sleep(3000); 



      } 

当我运行该脚本,得到如下错误:

org.openqa.selenium.ElementNotVisibleException: Cannot click on element (WARNING: The server did not provide any stacktrace information) 
Command duration or timeout: 85 milliseconds 
Build info: version: '2.48.2', revision: '41bccdd', time: '2015-10-09 19:55:52' 
System info: host: '0967JNBPBB010L', ip: '10.5.70.125', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.8.0_76-ea' 
Driver info: org.openqa.selenium.ie.InternetExplorerDriver 
Capabilities [{browserAttachTimeout=0, ie.enableFullPageScreenshot=true, enablePersistentHover=true, ie.forceCreateProcessApi=false, ie.forceShellWindowsApi=false, pageLoadStrategy=normal, ignoreZoomSetting=false, ie.fileUploadDialogTimeout=3000, version=9, platform=WINDOWS, proxy={proxyType=}, nativeEvents=true, ie.ensureCleanSession=false, elementScrollBehavior=0, ie.browserCommandLineSwitches=, requireWindowFocus=false, browserName=internet explorer, initialBrowserUrl=http://localhost:24652/, javascriptEnabled=true, ignoreProtectedModeSettings=false, enableElementCacheCleanup=true, unexpectedAlertBehaviour=dismiss}] 
Session ID: df6bf10c-51d0-46b3-ab24-95897f29223f 
    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:206) 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647) 
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:326) 
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84) 
    at com.org.frameworkFiles.stepDefinitions.StepDefinitions.User_captures_Origin(StepDefinitions.java:173) 
    at ?.And User captures Origin BRANCH(1_Create Application.feature:12) 

下面是创作的在下拉字段的引导代码我applicationn:

这部分代码是点击下拉:

<div class="btn-group bootstrap-select show-tick"> 
<button class="btn dropdown-toggle bs-placeholder btn-default" role="button" data-toggle="dropdown" type="button" data-id="ContentPlaceHolder1_ddlOrigin" title="Choose Origin Code"> 
<span class="filter-option pull-left">Choose Origin Code</span> 
<span class="bs-caret"> 
<span class="caret"/> 
</span> 
</button> 

这部分代码是选择下拉字段:场的亮点不仅是发生了:

<div class="dropdown-menu open" role="combobox"> 
<ul class="dropdown-menu inner" aria-expanded="false" role="listbox"> 
<li data-original-index="0"> 
<a class="" role="option" data-tokens="null" style="" tabindex="0" aria-disabled="false" aria-selected="false"> 
<span class="text">BRANCH</span> 
<span class="glyphicon glyphicon-ok check-mark"/> 
</a> 
</li> 
<li data-original-index="1"> 
<a class="" role="option" data-tokens="null" style="" tabindex="0" aria-disabled="false" aria-selected="false"> 
<span class="text">CALL CENTRE</span> 
<span class="glyphicon glyphicon-ok check-mark"/> 
</a> 
</li> 
<li data-original-index="2"> 
<a class="" role="option" data-tokens="null" style="" tabindex="0" aria-disabled="false" aria-selected="false"> 
<span class="text">INTERNET</span> 
<span class="glyphicon glyphicon-ok check-mark"/> 
</a> 
</li> 
<li data-original-index="3"> 
<a class="" role="option" data-tokens="null" style="" tabindex="0" aria-disabled="false" aria-selected="false"> 
<span class="text">PRIVATE BANKING</span> 
<span class="glyphicon glyphicon-ok check-mark"/> 
</a> 
</li> 
</ul> 
</div> 

再次选择HTML代码相同的字段,但是,当我尝试过萤火虫自认倒霉到higlight是突出写与上面的部分代码:

<select id="ContentPlaceHolder1_ddlOrigin" class="selectpicker" title="Choose Origin Code" data-max-options="1" multiple="" name="ctl00$ContentPlaceHolder1$ddlOrigin" tabindex="-98"> 
<option value="BRH">BRANCH</option> 
<option value="CC">CALL CENTRE</option> 
<option value="INT">INTERNET</option> 
<option value="PB">PRIVATE BANKING</option> 
</select> 
</div> 
<span id="ContentPlaceHolder1_RequiredFieldValidator8" class="zmdi zmdi-alert-triangle form-control-feedback" style="visibility:hidden;"/> 
</div> 
+0

在此猜测 - HTML选择标记不可见,因此使用“选择”编写的代码将不起作用。你的代码应该与ul和li交互,因为它们是可见的组件。 – Grasshopper

+0

@Grasshopper,在我的脚本中,我试图只与ul和li组件交互,你可以检查我的xpath - // span [contains(text(),'BRANCH')]。我从Firebug复制的第一个xpath点击该下拉列表。但是当我运行我的脚本时,点击本身并没有发生。 – SAUMARS

+0

您是否尝试过使用更简单的CSS选择器而不是长xpaths ...在您的脚本中,您正在移动到该元素,但未点击。您打印的链接数量的值是多少?哪一行是第173行? – Grasshopper

回答

1

你缺少点击下拉按钮。这是选择下拉选项的最小代码。请尝试让我知道。

@And("^User captures Origin (.*)$")    
    public void User_captures_Origin(String origin) throws Exception{ 

    // click on drop down button 
    WebElement DropdownButton = driver.findElement(By.xpath("//button[@data-id='ContentPlaceHolder1_ddlOrigin']")); 
    DropdownButton.click(); 

    // select a drop down option 
    WebElement DropdownOption= driver.findElement(By.xpath("//ul/li/a/span[text()="+origin+"]")); 
    DropdownOption.click(); 
    } 
+0

对不起,迟到的回应。非常感谢您的回答。它为我工作。我正在使用其他一些解决方案,并有更多的代码行来选择下拉值。但是你给出的解决方案是非常简单的行。 – SAUMARS