Как автоматизировать Amazon как веб-сайт электронной коммерции с помощью Selenium?
В этой статье с помощью Seleniumwebdriver показано, как автоматически добавлять адреса с помощью примера Java-программы.
Краткий обзор Селена:
Selenium используется для кросс-браузерного автоматизированного тестирования, и, поскольку он поддерживает множество браузеров, они очень полезны. Для использования Selenium в проекте нам потребуются отдельные виды банок, которые представлены на скриншоте ниже.
В противном случае, используя maven, мы также можем получить необходимые зависимости. Для парсинга веб-страниц нам необходимо знать внутреннее представление HTML каждого элемента. Это поможет идентифицировать элемент и предварительно заполнить значения из кода Java. Давайте посмотрим, как это сделать.
Пример проекта
В нашем примере давайте посмотрим, как это сделать с помощью chromedriver. т.е. в браузере chrome с помощью селена мы автоматизируем процесс заполнения адресов.
AmazonWebsiteAddressAutoSubmit.java
Java
import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import io.github.bonigarcia.wdm.WebDriverManager; public class AmazonWebsiteAddressAutoSubmit { public static void main(String[] args) { ChromeOptions chromeOptions = new ChromeOptions(); WebDriverManager.chromedriver().setup(); WebDriver driver = new ChromeDriver(chromeOptions); driver.manage().timeouts().pageLoadTimeout( 15 , TimeUnit.MINUTES); // Launch the Online Store Website try { LoginPage login = new LoginPage(driver); // Replace with your emailId login.set_username( "tltxxx@gmail.com" ); login.continueButtonClick(); // Replace with your password login.set_password( "xxxx" ); login.click_button(); NewAddressDetails addAddress = new NewAddressDetails(driver); // Replace the fields as per your requirement addAddress.set_fullname( "xxxxx" ); addAddress.set_phonenumber( "1234567890" ); addAddress.set_postalCode( "625 016" ); addAddress.set_addressLine1( "AddressLine1" ); addAddress.set_addressLine2( "AddressLine2" ); addAddress.set_city( "City" ); // Actually state has to be set // If not set, it will throw error while // clicking on the next submit button List<WebElement> allElements = driver.findElements(By.xpath( "//input[@class="a-button-input"]" )); WebElement clickableElement; for (WebElement element : allElements) { if (element.getAttribute( "aria-labelledby" ).equals( "address-ui-widgets-form-submit-button-announce" )) { clickableElement = element; clickableElement.click(); } } // Edit address part Thread.sleep( 5000 ); // We can check whether address // got added successfully Thread.sleep( 5000 ); // Print a Log In message to the screen System.out.println( "Successfully performed the operation of adding address" ); Thread.sleep( 5000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Close the driver driver.quit(); // driver.close(); } } class LoginPage { private WebDriver driver; @FindBy (id = "ap_email" ) WebElement username; @FindBy (id = "ap_password" ) WebElement password; @FindBy (id = "signInSubmit" ) WebElement button; @FindBy (id = "continue" ) WebElement continueButton; public LoginPage(WebDriver driver) { // initialize elements PageFactory.initElements(driver, this ); } public void set_username(String usern) { username.clear(); username.sendKeys(usern); } public void set_password(String userp) { password.clear(); password.sendKeys(userp); } public void click_button() { button.submit(); } public void continueButtonClick() { continueButton.submit(); } } class NewAddressDetails { // private WebDriver driver; @FindBy (id = "address-ui-widgets-enterAddressFullName" ) WebElement fullName; @FindBy (id = "address-ui-widgets-enterAddressPhoneNumber" ) WebElement phoneNumber; @FindBy (id = "address-ui-widgets-enterAddressPostalCode" ) WebElement postalCode; @FindBy (id = "address-ui-widgets-enterAddressCity" ) WebElement city; @FindBy (id = "address-ui-widgets-enterAddressLine1" ) WebElement addressLine1; @FindBy (id = "address-ui-widgets-enterAddressLine2" ) WebElement addressLine2; // @FindBy(id = "address-ui-widgets-enterAddressStateOrRegion") @FindBy (className = "a-button-inner" ) WebElement stateOrRegion; @FindBy (className = "a-button-input" ) // @FindBy(xpath = "//input[@class="a-button-input"]") WebElement button; public NewAddressDetails(WebDriver driver) { // initialize elements PageFactory.initElements(driver, this ); } public void set_fullname(String fname) { fullName.clear(); fullName.sendKeys(fname); } public void set_phonenumber(String phnumber) { phoneNumber.clear(); phoneNumber.sendKeys(phnumber); } public void set_postalCode(String pcode) { postalCode.clear(); postalCode.sendKeys(pcode); } public void set_city(String cty) { city.clear(); city.sendKeys(cty); } public void set_addressLine1(String line1) { addressLine1.clear(); addressLine1.sendKeys(line1); } public void set_addressLine2(String line2) { addressLine2.clear(); addressLine2.sendKeys(line2); } public void set_stateOrRegion(String region) { stateOrRegion.clear(); stateOrRegion.sendKeys(region); } public void click_button() { button.click(); /* * Actions builder = new Actions(AutoFill.driver); * builder.moveToElement(button).click(button); builder.perform(); */ } } class EditAddressDetails1 { private WebDriver driver; @FindBy (className = "a-button-input" ) WebElement button; public EditAddressDetails1(WebDriver driver) { // initialize elements PageFactory.initElements(driver, this ); } public void click_button() { button.submit(); } } |
URL: https://www.amazon.in/a/addresses/add?ref=ya_address_book_add_post
Как только селен пытается получить доступ к странице, в соответствии с запрошенной информацией, например
- Имя пользователя (это может быть ваш зарегистрированный адрес электронной почты)
- Пароль
предоставляются в первую очередь. Как только он будет проверен, он перейдет на следующую страницу, т.е. страницу добавления адреса. Там необходимо предоставить обязательные данные, такие как
- Имя
- Номер телефона
- Почтовый Код
- Адресная строка 1
- Адресная строка 2
- Город
- Состояние
а затем нужно нажать кнопку «Добавить адрес». Если вся вышеуказанная информация подтверждена, адрес будет успешно добавлен, иначе будет показано сообщение об ошибке. Таким образом, вместо того, чтобы вручную вводить данные и отправлять форму, все данные автоматически отправляются через наш код. Следовательно, Selenium — лучший выбор для автоматизированного тестирования. Всякий раз, когда в качестве средства проверки отображаются ошибки, нам нужно исправить их только с помощью кода. Поэтому для этих конкретных тегов необходимо знать их адресацию. В коде класса «LoginPage»
- ap_email
- ap_password
- signInSubmit для отправки
- продолжать для продолжения
Все вышеперечисленное является идентификаторами, и их легко идентифицировать с помощью
@FindBy(id = "ap_email") WebElement username; @FindBy(id = "ap_password") WebElement password; @FindBy(id = "signInSubmit") WebElement button; @FindBy(id = "continue") WebElement continueButton;
После того, как данные проверены как с точки зрения проверки на стороне клиента (например, без пробелов / без нулей / правильного идентификатора электронной почты и т. д. для идентификатора электронной почты и без пробела / без нуля для пароля), так и с точки зрения проверки на стороне сервера, например (адрес электронной почты / пароль регистрируется на сайт amazon), он перейдет на страницу добавления адреса
@FindBy(id = "address-ui-widgets-enterAddressFullName") WebElement fullName; @FindBy(id = "address-ui-widgets-enterAddressPhoneNumber") WebElement phoneNumber; @FindBy(id = "address-ui-widgets-enterAddressPostalCode") WebElement postalCode; @FindBy(id = "address-ui-widgets-enterAddressCity") WebElement city; @FindBy(id = "address-ui-widgets-enterAddressLine1") WebElement addressLine1; @FindBy(id = "address-ui-widgets-enterAddressLine2") WebElement addressLine2; // @FindBy(id = "address-ui-widgets-enterAddressStateOrRegion") @FindBy(className = "a-button-inner") WebElement stateOrRegion; @FindBy(className = "a-button-input") // @FindBy(xpath = "//input[@class="a-button-input"]") WebElement button;
Здесь также все данные проверяются и переходят на следующую страницу. Если какие-либо обязательные поля неверны, также будет отображаться ошибка. Только если все в порядке, он перейдет на следующую страницу. Для идентификации элементов для конкретного идентификатора нам нужно указать @FindBy (id = «address-ui-widgets-enterAddressLine2»), где «address-ui-widgets-enterAddressLine2» — это точное значение идентификатора и @FindBy (className = « a-button-inner»), где «a-button-inner» идентифицируется с именем класса. В случае многократного повторения класса с помощью XPath мы можем попытаться получить
List<WebElement> allElements = driver.findElements(By.xpath("//input[@class="a-button-input"]")); WebElement clickableElement; for (WebElement element : allElements) { if (element.getAttribute("aria-labelledby").equals("address-ui-widgets-form-submit-button-announce")) { clickableElement = element; clickableElement.click(); } }
Пример видео для приведенного выше кода:
Объяснение кода:
Выполнение кода: