java 如何使用 POM Selenium 从下拉列表中进行选择
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28216306/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to select from a dropdown using POM Selenium
提问by Tfish
so i need to select from a drop down and all the code seems to do is highlight the value and not select it,
所以我需要从下拉列表中进行选择,所有代码似乎都是突出显示值而不是选择它,
package uk.co.brightfuture.bfslogin.selenium.page;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.Select;
import uk.co.brightfuture.bfslogin.selenium.PagePath;
import uk.co.brightfuture.bfslogin.selenium.PageTitle;
public class CreateNewUserPage extends Page {
@FindBy(name = "firstname")
private WebElement firstNameTextBox;
@FindBy(name = "surname")
private WebElement surnameTextBox;
@FindBy(name = "phonenumber")
private WebElement phonenumberTextBox;
@FindBy(name = "username")
private WebElement userNameTextBox;
@FindBy(name = "password")
private WebElement passwordTextBox;
@FindBy(name = "next of kin firstname")
private WebElement nextOfKinFirstnameTextBox;
@FindBy(name = "next of kin surname")
private WebElement nextOfKinSurnameTextBox;
@FindBy(name = "next of kin phonenumber")
private WebElement nextOfKinPhonenumberTextBox;
@FindBy(name = "dropdown2")
private WebElement authorityDropdown;
@FindBy(name = "Admin")
private WebElement adminFromDropdown;
@FindBy(name = "User")
private WebElement userFromDropdown;
@FindBy(name = "Fire")
private WebElement fireMarshallFromDropdown;
@FindBy(name = "dropdown")
private WebElement groupDropdown;
@FindBy(name = "group")
private WebElement groupFromDropdown;
@FindBy(name = "add")
private WebElement addButton;
public CreateNewUserPage(WebDriver driver) {
super(driver, PageTitle.CREATEUSER, PagePath.CREATEUSER);
// COMPULSORY
this.driver = driver;
PageFactory.initElements(driver, this);
}
public void enterFirstName(String firstNameText) {
firstNameTextBox.sendKeys(firstNameText);
}
public void enterSurName(String surnameNameText) {
surnameTextBox.sendKeys(surnameNameText);
}
public void enterPhonenumber(String phonenumberText) {
phonenumberTextBox.sendKeys(phonenumberText);
}
public void enteruserName(String userNameText) {
userNameTextBox.sendKeys(userNameText);
}
public void enterpassword(String passwordText) {
passwordTextBox.sendKeys(passwordText);
}
public void enternextOfKinFirstname(String nextOfKinFirstNameText) {
nextOfKinFirstnameTextBox.sendKeys(nextOfKinFirstNameText);
}
public void enternextOfKinSurname(String nextOfKinSurnameText) {
nextOfKinSurnameTextBox.sendKeys(nextOfKinSurnameText);
}
public void enternextOfKinPhonenumber(String nextOfKinPhonenumberText) {
nextOfKinPhonenumberTextBox.sendKeys(nextOfKinPhonenumberText);
}
public void AuthorityDropDown() {
authorityDropdown.click();
}
public void adminViaDropDown() {
Select drop = new Select(authorityDropdown);
drop.selectByIndex(1);
}
public void userFromDropdown() {
userFromDropdown.click();
}
public void userFromDropDown() {
fireMarshallFromDropdown.click();
}
public void GroupDropDown() {
groupDropdown.click();
}
public Boolean getGroupDropown(String textToCheck) {
return groupFromDropdown.getText().equals(textToCheck);
}
public NewUserConfirmationPage AddUserButton() {
addButton.click();
return new NewUserConfirmationPage(driver);
}
}
}
and here's the test i'm trying to run,
这是我正在尝试运行的测试,
/**
* this test will go to the new create new user page via the dash board and
* it will enter the required data into the text fields.
*/
@Test
public void createNewUserWithCorrectData() {
createNewUserPage = dashboardPage.clickCreateNewUserLink();
assertTrue(isOnThisPage(PagePath.CREATEUSER));
createNewUserPage.enterFirstName(FIRST_NAME);
createNewUserPage.enterSurName(SURNAME);
createNewUserPage.enterPhonenumber(PHONE_NUMBER);
createNewUserPage.enteruserName(EMAIL);
createNewUserPage.enterpassword(PASSWORD);
createNewUserPage.enternextOfKinFirstname(NEXT_OF_KIN_FIRST_NAME);
createNewUserPage.enternextOfKinSurname(NEXT_OF_KIN_SURNAME);
createNewUserPage.enternextOfKinPhonenumber(NEXT_OF_KIN_PHONE_NUMBER);
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0,250)", "");
createNewUserPage.AuthorityDropDown();
createNewUserPage.adminViaDropDown();
createNewUserPage.GroupDropDown();
createNewUserPage.getGroupDropown(GROUP);
newUserConfirmationPage = createNewUserPage.AddUserButton();
assertTrue(isOnThisPage(PagePath.CREATECONFIRMED));
}
However i can only use Page object models as my manager won't allow us to use anything else.
但是我只能使用 Page 对象模型,因为我的经理不允许我们使用其他任何东西。
<body>
<div class="back">
<div id="different">
<form method="post">
<div class="center">
<h1 id="large">ADD NEW USER</h1>
</div>
<input type="string" class="form-control" name="firstname"
placeholder="Firstname"> <input type="string"
class="form-control" name="surname" placeholder="Surname">
<input type="number" class="form-control" name="phonenumber"
placeholder="Phonenumber"> <input type="string"
class="form-control" name="username" placeholder="Username">
<c:if test="${UserAlreadyExists}">
<h6
style="margin-bottom: 10px; margin-top: -10px; margin-left: 14px; color: red;">User:${username},
already exists</h6>
</c:if>
<input type="password" class="form-control" name="password"
placeholder="Password"> <input type="string"
class="form-control" name="next of kin firstname"
placeholder="Next of kin firstname"> <input type="string"
class="form-control" name="next of kin surname"
placeholder="Next of kin surname"> <input type="number"
class="form-control" name="next of kin phonenumber"
placeholder="Next of kin Phonenumber">
<!-- this section is for the button and the drop down section -->
<div class="centered">
<div class="row">
<div id="groupMenu">
<div class="btn-group">
<form>
<select class="form-control" id="dropdown2"
style="width: 160px;" name="dropdown2">
<option value="feedback" name="choose">Select
Authority</option>
<option name="admin">Admin</option>
<option name="user">User</option>
<option name="fire">Fire Marshall</option>
</select> <select class="form-control" id="dropdown"
style="width: 160px;" name="dropdown">
<option value="feedback" name="choose">Select Group</option>
<c:forEach items="${Groups}" var="group" varStatus="status">
<option name="group" value="${group.id}">
${group.groupName}</option>
</c:forEach>
</select>
</form>
</div>
</div>
<button class="btn btn-default" type="submit" name="add" id="btn1"
onclick="javascript: form.action='Submit';">ADD</button>
</div>
</div>
</form>
</div>
</div>
here is the HTML
这是 HTML
采纳答案by Saifur
You need to give us the stacktrace
and
你需要给我们stacktrace
和
public void adminViaDropDown() {
Select drop = new Select(authorityDropdown);
drop.selectByIndex(1);
}
only selects the dropdown with first index
只选择带有第一个索引的下拉列表
You should do
你应该做
public void adminViaDropDown(int index) {
Select drop = new Select(authorityDropdown);
drop.selectByIndex(index);
}
use:
利用:
createNewUserPage.adminViaDropDown(1);
You also have multiple options on how you want to select the dropdown. See this
您还可以通过多种方式选择下拉菜单。看到这个
However, sometimes the element mapping technique does not work as expected if the element is dynamically loaded. I would find the element in realtime in that case.
但是,如果元素是动态加载的,有时元素映射技术不会按预期工作。在这种情况下,我会实时找到元素。
public void adminViaDropDown(int index) {
WebEelement ele = driver.findElement("your by selector")
Select drop = new Select(ele );
drop.selectByIndex(index);
}
And, another possibility is the wait. I would plug that in at the end if nothing works. This is explicit wait
而且,另一种可能性是等待。如果没有任何效果,我会在最后插入它。这是explicit wait
public void adminViaDropDown(int index) {
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
Select drop = new Select(myDynamicElement );
drop.selectByIndex(index);
}
Edit:find the option directly using css
编辑:直接使用查找选项css
//css
public void adminViaDropDownByName() {
By byCss = By.cssSelector("#dropdown2>option[name='admin']");
driver.findElement(byCss).click();
}
2nd EditI don't like the HTML
design here. You should talk to the developer. however, I found a real bad way to handle this. I wouldn't suggest this. But a workaround only.
第二次编辑我不喜欢HTML
这里的设计。你应该和开发商谈谈。然而,我发现了一个非常糟糕的方法来处理这个问题。我不会建议这个。但只是一种解决方法。
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementById('dropdown2').querySelector('[name=admin]').setAttribute('selected','selected');");