/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.keycloak.testsuite.auth.page.login; import org.jboss.arquillian.graphene.page.Page; import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.testsuite.auth.page.account.AccountFields; import org.keycloak.testsuite.auth.page.account.PasswordFields; import org.keycloak.testsuite.page.Form; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import static org.keycloak.testsuite.admin.Users.getPasswordOf; import static org.keycloak.testsuite.util.WaitUtils.waitForPageToLoad; import static org.keycloak.testsuite.util.WaitUtils.waitUntilElement; import static org.keycloak.testsuite.util.WaitUtils.waitUntilElementIsNotPresent; /** * * @author tkyjovsk */ public class LoginForm extends Form { @Page private AccountFields accountFields; @Page private PasswordFields passwordFields; @Page private TotpSetupForm totpForm; @FindBy(name = "login") private WebElement loginButton; // @FindBy(name = "cancel") // private WebElement cancelButton; @FindBy(xpath = "//div[@id='kc-registration']/span/a") private WebElement registerLink; @FindBy(linkText = "Forgot Password?") private WebElement forgottenPassword; @FindBy(id = "rememberMe") private WebElement rememberMe; @FindBy(xpath = ".//label[@for='password']") private WebElement labelPassword; public void setUsername(String username) { accountFields.setUsername(username); } public void setPassword(String password) { passwordFields.setPassword(password); } public void login(UserRepresentation user) { login(user.getUsername(), getPasswordOf(user)); } public void login(String username, String password) { setUsername(username); setPassword(password); login(); } public void register() { registerLink.click(); waitForPageToLoad(driver); } public void login() { labelPassword.click(); // This is a nasty trick for IE; As IE was "moving the cursor" towards the login button // it opened the internationalization menu (when present) and then clicked // one of the languages instead of the Login button loginButton.click(); waitForPageToLoad(driver); } public void forgotPassword() { forgottenPassword.click(); waitForPageToLoad(driver); } public void rememberMe(boolean value) { boolean selected = rememberMe.isSelected(); if ((value && !selected) || !value && selected) { rememberMe.click(); waitForPageToLoad(driver); } } // @Override // public void cancel() { // waitUntilElement(cancelButton).is().present(); // cancelButton.click(); // } public void waitForUsernameInputPresent() { accountFields.waitForUsernameInputPresent(); } public void waitForRegisterLinkNotPresent() { waitUntilElementIsNotPresent(driver, registerLink); } public void waitForResetPasswordLinkNotPresent() { waitUntilElement(forgottenPassword).is().not().present(); } public void waitForRememberMePresent() { waitUntilElement(rememberMe).is().present(); } public void waitForRememberMeNotPresent() { waitUntilElementIsNotPresent(driver, rememberMe); } public void waitForLoginButtonPresent() { waitUntilElement(loginButton).is().present(); } public TotpSetupForm totpForm() { return totpForm; } public class TotpSetupForm extends Form { @FindBy(id = "totp") private WebElement totpInputField; @FindBy(id = "totpSecret") private WebElement totpSecret; @FindBy(xpath = ".//input[@value='Submit']") private WebElement submit; public void waitForTotpInputFieldPresent() { waitUntilElement(totpInputField).is().present(); } public void setTotp(String value) { setInputValue(totpInputField, value); } public String getTotpSecret() { return totpSecret.getAttribute(VALUE); } public void submit() { submit.click(); waitForPageToLoad(driver); } } }