Есть веб-сайт с div, содержащим 7 элементов, когда один элемент добавляется в корзину, появляется новое всплывающее окно с предложением продолжить покупки или оформить заказ. Нужно автоматизировать, добавляйте все 7 предметов один за другим, нажимая «Продолжить покупки» над всплывающим окном.
Я пробовал это с вложенными циклами For, но похоже, что вложенная переменная цикла «j» не увеличивается.
В настоящее время для первого элемента работает, как и ожидалось, но для остальных элементов выполняется только действие наведения мыши первого цикла.
Также, пожалуйста, сообщите, есть ли какие-либо лучшие методы, чем мой метод, очень признателен.
Код:
import java.time.Duration;
import java.util.List;
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.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class DressShop {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "D:/Java with Lan/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
driver.get("http://automationpractice.com/index.php");
List<WebElement> offers = driver.findElements(By.cssSelector("#homefeatured li"));
List<WebElement> addCarts = driver.findElements(By.xpath("//ul[@id='homefeatured']/li/div/div[2]/div[2]/a[1]"));
Actions a = new Actions(driver);
for (int i = 0; i < offers.size(); i++) {
WebElement offer = offers.get(i);
a.moveToElement(offer).build().perform();
for (int j = 0; j == i; j++) {
WebElement addCart = addCarts.get(j);
wait.until(ExpectedConditions.elementToBeClickable(addCart));
a.moveToElement(addCart).click().build().perform();
WebElement closePop = driver.findElement(By.xpath("//span[@title='Continue shopping']"));
wait.until(ExpectedConditions.elementToBeClickable(closePop));
a.moveToElement(closePop).click().build().perform();
}
}
}
}
Вам действительно не нужен вложенный цикл для такого типа сценариев.
Вы можете собрать все ссылки
//ul[@id='homefeatured']//li
используя этот xpath, теперь выполните итерацию по списку и наведите указатель мыши на каждый продукт и нажмите «Добавить в корзину», а затем продолжите покупки.
Код:
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "D:/Java with Lan/chromedriver.exe");
WebDriver driver = new ChromeDriver();
wait = new WebDriverWait(driver, Duration.ofSeconds(30));
driver.manage().window().maximize();
driver.get("http://automationpractice.com/index.php");
Actions action = new Actions(driver);
List<WebElement> allLinks = driver.findElements(By.xpath("//ul[@id='homefeatured']//li"));
for (WebElement link : allLinks) {
action.moveToElement(wait.until(ExpectedConditions.visibilityOf(link))).pause(3).build().perform();
WebElement addToCart = link.findElement(By.xpath(".//descendant::div[@class='right-block']//descendant::a[@title='Add to cart']"));
action.moveToElement(addToCart).pause(2).click().build().perform();
//wait.until(ExpectedConditions.elementToBeClickable(By.xpath(".//descendant::div[@class='right-block']//descendant::a[@title='Add to cart']")));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@title='Continue shopping']"))).click();
}
Да, братан, теперь понял, вложенный цикл был бесполезен, я думаю, я слишком много думал :) Извините за неудобства. Спасибо за помощь
Это должно работать с Selenium4. если вы используете Selenium 3, используйте вместо этого эту строку
wait = new WebDriverWait(driver, 30);