繁体   English   中英

列表<webelement>没有在 selenium 中存储所有必需的元素</webelement>

[英]List<WebElement> is not storing all the required elements in selenium

我的 myntra 愿望清单有 41 种产品,其中 19 种缺货。 我尝试打印“缺货”产品的名称。

“缺货”元素有一个常见的 class 名称,我使用 xpath 通过遍历父节点和子节点来识别产品名称。

当我在控制台中验证它时,它给出了正确的响应。 它显示了19种产品,当我将鼠标指针悬停时,它按预期突出了缺货产品。 当我调试代码时也按预期工作。

但是当我点击运行时,它只打印了 7 个产品,列表的大小是7

该页面最初显示前20 个产品,然后在我们向下滚动时显示剩余的产品。 在前 20 名中,有7名缺货。 这可能是一个原因。 如果是这样,如何处理这个滚动事件?

这是代码片段:

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.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
 
public class stockout {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "path of chromedriver.exe");  
        WebDriver driver = new ChromeDriver();
        WebDriverWait w =new WebDriverWait(driver,30);
        
        driver.get(myntra login page);
    //enter phone number          driver.findElement(By.xpath(("//div[@class='signInContainer']/div[2]/div/input"))).sendKeys(phone number);
        driver.findElement(By.cssSelector("div.submitBottomOption")).click();
        Thread.sleep(2000);
        driver.findElement(By.xpath("//div[@class='bottomeLink']/span")).click();
    //enter password
            driver.findElement(By.xpath("//input[@type='password']")).sendKeys(password);
        driver.findElement(By.cssSelector("button.btn.primary.lg.block.submitButton")).click();
        Thread.sleep(4000);
    //open wishlist
        driver.findElement(By.cssSelector("span.myntraweb-sprite.desktop-iconWishlist.sprites-headerWishlist")).click();
    //add out of stock elements to a list
        List<WebElement> outofstock = driver.findElements(By.xpath("//img[@class='itemcard-outOfStockItemImage itemcard-itemImage']/parent::picture/parent::a/parent::div/parent::div/div[2]/div/p[1]"));
    //explicit wait
            w.until(ExpectedConditions.visibilityOfAllElements(outofstock));
        System.out.println(outofstock.size());
        System.out.println("Items out of stock:");
        for (WebElement product: outofstock)
        {   System.out.println(product.getText());
        }
    }
}

在网上找到了解决方案,但想知道是否有更简单的方法可以做到这一点。 欢迎提出建议。

我添加了这段代码向下滚动并且它起作用了:

try {
        Object lastHeight = ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");

        while (true) {
            ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
            Thread.sleep(2000);

            Object newHeight = ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
            if (newHeight.equals(lastHeight)) {
                break;
            }
            lastHeight = newHeight;
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

如果您期望存在特定数量的元素,则可以使用以下代码。

new WebDriverWait(driver,10).until(ExpectedConditions.numberOfElementsToBe(By by, 19));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM