Based on the common requirement of using a checkbox when doing test automation, we can define a Checkbox class to encapsulate the behaviours as following, and it only has two public methods, setValue and isChecked.
public class Checkbox<Where extends Searchable<Where>> { private final Where where; private final Locator<Where, Element> locator; /** * Constructor of the checkbox. * * @param where the place the checkbox can be found * @param selector the selector that leads to the checkbox */ Checkbox(final Where where, Supplier<By> selector) { this.where = where; this.locator = element(selector); } /** * Change the checkbox according to the value parameter * * @param value true or false */ public void setValue(boolean value) { Element apply = locator.locate(where); if (apply != null && apply.isSelected() != value) { apply.click(); } } /** * @return whether the checkbox is checked or not */ public boolean isChecked() { return locator.and(CHECKED).and(TRUE).test(where); } }
If you don't want to create a new instance of Checkbox, you can use the helper methods in FormControl to read and write the checkbox that can be found using the locator parameter,
/** * Check if the checkbox is checked by the given selector. * * @param selector selector * @return true if it is checked. */ @SuppressWarnings("unchecked") default public boolean isChecked(Supplier<By> selector) { return new Checkbox<>((Where) this, selector).isChecked(); } /** * Set checkbox to the given value. * * @param selector selector * @param value value */ @SuppressWarnings("unchecked") default public void check(Supplier<By> selector, boolean value) { new Checkbox<>((Where) this, selector).setValue(value); }
So in a page,
AbstractPage page = new AbtractPage(Browsers.CHROME); System.out.println(page.isChecked(CONFIRM_EMAIL_)), System.out.println(page.isChecked(RATINGS_______)), page.check(CONFIRM_EMAIL_, false); page.check(RATINGS_______, true);
And it will print true and false on the console and change the checkboxes to the following,
Here is the code how it is used in a form and a page object and a test,
public class OtherInformationForm extends AbstractPage { public OtherInformationForm(AbstractPage page) { super(page); } public void setOtherInformation(OtherInformation info) { put(BILLING_EMAIL___, info.emailAddress); put(COMMENTS________, info.comments); check(CONFIRM_EMAIL_, info.confirmEmail); check(RATINGS_______, info.askRating); radio(MAILING_OPTION, info.mailingOptions); } public OtherInformation getOtherInformation() { return new OtherInformation( get(BILLING_EMAIL___), isChecked(CONFIRM_EMAIL_), isChecked(RATINGS_______), MailingOptions.valueOf(get(MAILING_OPTION)), get(COMMENTS________)); } }
public class ShoppingCartPage extends AbstractPage { private final BillingAddressForm billingAddressForm = new BillingAddressForm(this); private final CreditCardForm creditCardForm = new CreditCardForm(this); private final OtherInformationForm otherInformationForm = new OtherInformationForm(this); public ShoppingCartPage(AbstractPage page) { super(page); } public void setBillingAddress(Address address) { billingAddressForm.setBillingAddress(address); } public void getBillingAddress() { billingAddressForm.getBillingAddress(); } public void setCreditCard(CreditCard card) { creditCardForm.setCreditCard(card); } public CreditCard getCreditCard() { return creditCardForm.getCreditCard(); } public void setQuantity(int quantity) { put(Xpath.QUANTITY, quantity); button(UPDATE).click(); } public void setOtherInformation(OtherInformation info) { otherInformationForm.setOtherInformation(info); } public OtherInformation getOtherInformation() { return otherInformationForm.getOtherInformation(); } public void continues() { button(CONTINUE).click(); } public ErrorMessages getErrorMessages() { return new ErrorMessages(this); } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:bookstore/beans/context.xml"}) public class BookStoreShoppingTest { @Autowired private Address billingAddress; @Autowired private CreditCard creditCard; @Autowired private OtherInformation otherInformation; @Autowired private ErrorMessages expectedErrorMessages; @Autowired private BookStoreHomePage homePage; @Test public void invalidCardInfo() { BookListPage listPage = new BookListPage(homePage, homePage.link(JAVA), IS_COPYRIGHTED) {{ open(); link(ACTIVE_MQ_IN_ACTION).click(); }}; BookDetailsPage bookPage = new BookDetailsPage(listPage) {{ until(IS_COPYRIGHTED); secondAddToCart().click(); }}; ShoppingCartPage cartPage = new ShoppingCartPage(bookPage) {{ setQuantity(2); setBillingAddress(billingAddress); setCreditCard(creditCard); setOtherInformation(otherInformation); continues(); }}; assertEquals(expectedErrorMessages, cartPage.getErrorMessages()); } @Test public void invalidCardInfoNormalWay() { BookListPage listPage = new BookListPage(homePage, homePage.link(JAVA), IS_COPYRIGHTED); listPage.open(); listPage.link(ACTIVE_MQ_IN_ACTION).click(); BookDetailsPage bookPage = new BookDetailsPage(listPage); bookPage.until(IS_COPYRIGHTED); bookPage.secondAddToCart().click(); ShoppingCartPage cartPage = new ShoppingCartPage(bookPage); cartPage.setQuantity(2); cartPage.setBillingAddress(billingAddress); cartPage.setCreditCard(creditCard); cartPage.setOtherInformation(otherInformation); cartPage.continues(); assertEquals(expectedErrorMessages, cartPage.getErrorMessages()); } @Before public void setup() { homePage.open(); } @After public void close() { homePage.close(); } }
No comments:
Post a Comment