2015-02-11 54 views
0
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(); 
} 

}使用Java數組或列表,以填補硒頁面設計的頁面上的文本框對象模型

上面你可以看到的JoinNow()函數有多個參數,它工作完美的罰款。我想使用數組或列表來減少參數的數量,然後使用循環來填充文本框。我想完成類似如下的操作,但由於我使用的是頁面對象模型設計,因此無法使用findElement。

@SuppressWarnings("unchecked") 
protected void JoinNow(String... var) { 
    List<MyElements> inputElements = new ArrayList<MyElements>(); 
    inputElements.add((MyElements) driver.findElement(By 
      .id("firstName-coldRegistrationForm"))); 
    inputElements.add((MyElements) driver.findElement(By.id("lastName"))); 
    inputElements.add((MyElements) driver.findElement(By 
      .id("email-coldRegistrationForm"))); 
    inputElements.add((MyElements) driver.findElement(By 
      .id("password-coldRegistrationForm"))); 

    for (int i = 0; i < var.length; i++) { 
     ((WebElement) inputElements.get(i)).sendKeys(var[i]); 
    } 
} 
+0

我很困惑,其中的代碼段第二屆「保護無效JoinNow」所在。驅動程序的引用來自哪裏? – 2015-02-11 00:14:02

+0

第二個JoinNow(String ... var)就是我在實現頁面對象模型設計之前使用的東西,現在不再使用了 – user3325340 2015-02-11 00:17:31

回答

0

爲什麼不派MapJoinNow方法。我建議你保持你的PageObject模式。我相信這是更具可讀性和更易於維護的長期

Map<String,String> data = new HashMap<String,String>(); 
data.put("firstname", "George"); 
data.put("lastname", "Clooney"); 
data.put("email", "[email protected]"); 
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")); 
} 
+0

感謝您的回覆。你能告訴我怎樣才能聲明map變量並調用JoinNow函數? – user3325340 2015-02-11 04:54:31

+1

@ nilesh。多謝兄弟。 – user3325340 2015-02-11 05:29:53

+0

很高興幫助:) – nilesh 2015-02-11 05:31:41

0

在做頁面對象模型時,您需要考慮幾個項目。根據您的做法(通過使用@FindBy),有時您最終會得到過時的數據。爲了獲得更好的結果,你應該像下面那樣定義你的id並用它們來獲得你的Webelemment。這是我設計它的方式。定義所有By.id並將其放入列表中,並使用下面的函數來簡化它。由

定義: static final By FNAME_REGFORM_BY_ID = By.id("firstName-coldRegistrationForm");

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)); 
    } 
} 

編輯:爲了更好地理解,fillTextBoxes相當於joinNow的。

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)); 
    } 
} 

不要使用註釋@FindBy(如何= How.ID使用=「電子郵件coldRegistrationForm」)等,因爲這延緩執行以及給你過時的數據。 FindBy往往會減慢,因爲只有在所有元素都可用後,整個頁面對象纔會完全初始化。嘗試使用Static By就像我提到的。我們遇到了perf問題,並開始從註釋的Findby切換。

根據要求,這裏是一個示例實現。您可能需要根據您的項目需求進行調整,但這應該開始。

您的Page Class(爲了我而改名爲SO)。

public class SO { 

    WebDriver driver; 

    static final By FNAME_REGFORM_BY_ID = By.id("firstName-coldRegistrationForm"); 
    static final By LNAME_REGFORM_BY_NAME = By.className("lastName"); 
    static final By EMAIL_REGFORM_BY_ID = By.id("email-coldRegistrationForm"); 
    static final By PWD_REGFORM_BY_ID = By.id("password-coldRegistrationForm"); 
    static final By SUBMIT_REGFORM_BY_ID = By.id("btn-submit"); 

    public SO(WebDriver driver) { 
     this.driver = driver; 
    } 

    public List<By> getAllInput() { 
     List<By> bys = new LinkedList<By>(); 
     bys.add(FNAME_REGFORM_BY_ID); 
     bys.add(LNAME_REGFORM_BY_NAME); 
     bys.add(LNAME_REGFORM_BY_NAME); 
     bys.add(LNAME_REGFORM_BY_NAME); 
     bys.add(LNAME_REGFORM_BY_NAME); 
     return bys; 
    } 

    public void joinNow(List<String> values) { 
     PageFactory.initElements(this.driver, HotelDetailsPage.class); 
     List<By> bys = this.getAllInput(); 
     List<WebElement> webElements = this.driver.findElements(By.cssSelector("input[type=text]")); 
     for (int i = 0; i < bys.size(); i++) { 
      new ChromeDriver().findElement(bys.get(i)).sendKeys(values.get(i)); 
     } 
    } 

    public SO open(final String url) { 
     this.driver.get(url); 
     return this; 
    } 
} 

測試方法:

@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); 
} 
+0

你能告訴我怎樣使用參數從測試類中調用JoinNow函數:(List bys,列表 valuesToPopulate) – user3325340 2015-02-11 05:00:29

+0

@ minion,你能告訴我如何從TestClass調用joinNow(List bys,List values)方法嗎?另外,我使用的不是Chrome瀏覽器的驅動程序。如果您能向我展示完整的Testclass,完整的POM類和完整的基類,我將不勝感激。 – user3325340 2015-02-11 18:01:57

+0

看看我的編輯。 – minion 2015-02-11 21:44:44

0

以下是另一種方式:

HashMap<WebElement, String> d = new HashMap<WebElement, String>(); 
d.put(newFirstNameTexthBox, "Michael"); 
d.put(newLastNameTexthBox, "Johnson"); 
d.put(newEmailTexthBox, "[email protected]"); 
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()); 
} 
相關問題