使用Selenium Web Driver测试动态加载的内容

时间:2012-10-02 14:23:04

标签: selenium webdriver selenium-webdriver gui-testing

我正在开发一个具有基于Web的前端的系统,我正在使用Selenium进行测试。在一个页面上,当向下滚动时内容是动态加载的(也许你知道来自Facebook的朋友列表),因为这是要求之一。

使用Selenium Webdriver(我使用Chrome)向下滚动应该没有问题通过Javascript。但是动态添加的内容存在问题。如何让Webdriver找到这些元素?

我尝试了以下内容向下滚动,直到不再加载内容:

int oldSize = 0;
int newSize = 0;
do {
  driver.executeScript("window.scrollTo(0,document.body.scrollHeight)");
  newSize = driver.findElementsBy(By.cssSelector("selector").size();
} while(newSize > oldSize);

但是,虽然页面第一次向下滚动,而现在某些内容已正确加载,但驱动程序的findElementsBy(By)函数找不到它们。

有人遇到过这个问题吗?如果有人能帮助我找到解决办法,我会很高兴的!

问候,本杰明

3 个答案:

答案 0 :(得分:4)

我建议将WebDriverWait与ExpectedConditons一起使用。

//scroll down with Javascript first
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector")));
//interact with your element
element.click()

查看Selenium官方网页提供的指南: http://seleniumhq.org/docs/04_webdriver_advanced.html

答案 1 :(得分:1)

特别尝试使用流利的等待。主要特点是:

Wait接口的实现,可以动态配置其超时和轮询间隔。 每个FluentWait实例定义等待条件的最大时间量,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

所描述的方法将返回您可以使用的web元素。 所以方法如下: 1)您需要找到滚动后期望呈现的元素选择器 例如

String cssSelector = "blablabla"

2)用js向下滚动 3)

WebElement neededElement  = fluentWait(cssSelector);
neededElement.click();
//neededElement.getText().trim();

您可以获得有关流利等待here

的更多信息

答案 2 :(得分:0)

我认为问题在于等待动态内容完成加载。尝试在findElementsBy之前等待3秒?在C#中,代码是Thread.Sleep(3000);