Вложенный цикл for не увеличивается в сценарии Selenium Automation

Есть веб-сайт с 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();

            }

        }

    }

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам действительно не нужен вложенный цикл для такого типа сценариев.

Вы можете собрать все ссылки

//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);

cruisepandey 18.03.2022 18:52

Да, братан, теперь понял, вложенный цикл был бесполезен, я думаю, я слишком много думал :) Извините за неудобства. Спасибо за помощь

LaN tHe MaN 19.03.2022 17:30

Другие вопросы по теме