使用JAVA数组或列表填充由Selenium页面对象模型设计的页面上的文本框

使用JAVA数组或列表填充由Selenium页面对象模型设计的页面上的文本框,java,selenium,Java,Selenium,} 正如您所看到的,上面的JoinNow函数接受多个参数,并且工作得非常好。我想使用数组或列表来减少 参数的数量,然后使用循环填充文本框。我想实现如下类似的功能,但由于我使用的是页面对象模型设计,所以不能使用findElement package com.objects; import java.util.ArrayList; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebD

}

正如您所看到的,上面的JoinNow函数接受多个参数,并且工作得非常好。我想使用数组或列表来减少 参数的数量,然后使用循环填充文本框。我想实现如下类似的功能,但由于我使用的是页面对象模型设计,所以不能使用findElement

package com.objects;
import java.util.ArrayList;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;
import com.tests.BaseClass;

public class LinkedInHomePage extends BaseClass {

public LinkedInHomePage(WebDriver driver) {
    PageFactory.initElements(driver, this);
}

@FindBy(how = How.ID, using = "firstName-coldRegistrationForm")
public WebElement newFirstNameTexthBox;

@FindBy(how = How.NAME, using = "lastName")
public WebElement newLastNameTexthBox;

@FindBy(how = How.ID, using = "email-coldRegistrationForm")
public WebElement newEmailTexthBox;

@FindBy(how = How.ID, using = "password-coldRegistrationForm")
public WebElement newPasswordTexthBox;

@FindBy(how = How.ID, using = "btn-submit")
public WebElement signUpButton;

public void EnterNewFirstName(String inComingNewFirstName) {
    newFirstNameTexthBox.clear();
    newFirstNameTexthBox.sendKeys(inComingNewFirstName);
}

public void EnterNewLastName(String inComingNewLastName) {
    newLastNameTexthBox.clear();
    newLastNameTexthBox.sendKeys(inComingNewLastName);
}

public void EnterNewEmail(String inComingNewEmail) {
    newEmailTexthBox.clear();
    newEmailTexthBox.sendKeys(inComingNewEmail);
}

public void EnterNewPassword(String inComingNewPassword) {
    newPasswordTexthBox.clear();
    newPasswordTexthBox.sendKeys(inComingNewPassword);
}

public void ClickSignUp() {
    signUpButton.click();
}

public void JoinNow(String FName, String LName, String Email,
        String Password) {
    EnterNewFirstName(FName);
    EnterNewLastName(LName);
    EnterNewEmail(Email);
    EnterNewPassword(Password);
    ClickSignUp();
}

在做页对象模型时,有两个项目需要考虑。根据您使用@FindBy的方式,有时您最终会得到过时的数据。为了获得更好的结果,您应该像下面那样定义您的ID,并使用它们来获得WebElement。这就是我设计它的方式。定义所有By.id并将其放入列表中,然后使用下面的函数简化它

定义由: 静态final By FNAME_REGFORM_By_ID=By.idfirstName-coldRegistrationForm

编辑:为了更好地理解,FillTextBox相当于joinNow

public void fillTextBoxes(List<By> bys, List<String> valuesToPopulate) {
    List<WebElement> webelements = new ChromeDriver().findElements(By.cssSelector("input[type=text]"));
    for (int i = 0; i < bys.size(); i++) {
        new ChromeDriver().findElement(bys.get(i)).sendKeys(valuesToPopulate.get(i));
    }
}
不要使用带注释的@FindByhow=How.ID、using=email coldRegistrationForm等,因为这会降低执行速度,并给您带来陈旧的数据。当整个页面对象只有在所有元素都可用后才完全初始化时,FindBy的速度往往会减慢。试着像我提到的那样使用Static。我们遇到了性能问题,开始从带注释的Findby切换

根据请求,下面是一个示例实现。您可能需要根据您的项目需求进行调整,但这应该开始了

为了我的缘故,您的页面类重命名为

List<String> values=new LiskedList<String>();
Values.add("emailid");
values.add("firstname");

List<By> bys=new LinkedList<By>();
bys.add(FNAME_REGFORM_BY_ID);
bys.add(EMAIL_ID_By_ID);

public void joinNow(List<By> bys, List<String> values) {
    List<WebElement> webelements = new ChromeDriver().findElements(By.cssSelector("input[type=text]"));
    for (int i = 0; i < bys.size(); i++) {
        new ChromeDriver().findElement(bys.get(i)).sendKeys(valuesToPopulate.get(i));
    }
}
试验方法:

为什么不向JoinNow方法发送映射呢。我建议您保持页面对象模式不变。我相信从长远来看,这更具可读性和可维护性

   @Test
public void testForm() {
    WebDriver driver = new FirefoxDriver();
    SO so = new SO(driver);
    SO soPage = so.open("your app url");

    List<String> values = new LinkedList<String>();
    values.add("firstname");
    values.add("lastName");
    values.add("emailId");
    values.add("password");
    values.add("id");
    soPage.joinNow(values);
}

以下是另一种方式:

Map<String,String> data  = new HashMap<String,String>();
data.put("firstname", "George");
data.put("lastname", "Clooney");
data.put("email", "George@xyz.com");
data.put("password", "Dontguess");
JoinNow(data);

protected void JoinNow(Map<String,String> data) {
    firstNameElement.sendKeys(data.get("firstname"));
    lastNameElement.sendKeys(data.get("lastname"));
    emailElement.sendKeys(data.get("email"));
    passwordElement.sendKeys(data.get("password"));
}

我不知道第二段代码现在在哪里。对驱动程序的引用来自哪里?第二个JoinNowString。。。var只是我在实现页面对象模型设计之前使用的东西&现在不再使用了,谢谢你的回复。您能告诉我如何声明映射变量并调用JoinNow函数吗?您能告诉我如何使用参数从测试类调用JoinNow函数:List bys,List valuesToPopulate@minion,您能告诉我如何从测试类调用joinNowList bys,List values方法吗?另外,我使用的是firefox驱动程序,而不是chrome。如果您能向我展示完整的Testclass、完整的POM类和完整的基类,我将不胜感激。
   @Test
public void testForm() {
    WebDriver driver = new FirefoxDriver();
    SO so = new SO(driver);
    SO soPage = so.open("your app url");

    List<String> values = new LinkedList<String>();
    values.add("firstname");
    values.add("lastName");
    values.add("emailId");
    values.add("password");
    values.add("id");
    soPage.joinNow(values);
}
Map<String,String> data  = new HashMap<String,String>();
data.put("firstname", "George");
data.put("lastname", "Clooney");
data.put("email", "George@xyz.com");
data.put("password", "Dontguess");
JoinNow(data);

protected void JoinNow(Map<String,String> data) {
    firstNameElement.sendKeys(data.get("firstname"));
    lastNameElement.sendKeys(data.get("lastname"));
    emailElement.sendKeys(data.get("email"));
    passwordElement.sendKeys(data.get("password"));
}
HashMap<WebElement, String> d = new HashMap<WebElement, String>();
d.put(newFirstNameTexthBox, "Michael");
d.put(newLastNameTexthBox, "Johnson");
d.put(newEmailTexthBox, "a@b.com");
d.put(newPasswordTexthBox, "Michael123$");
joinNow(d); 


protected void JoinNow(Map<WebElement,String> data) {
    for (Entry<WebElement, String> objValue : data.entrySet())
        objValue.getKey().sendKeys(objValue.getValue());
}