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