我正在开发一个具有基于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)函数找不到它们。
有人遇到过这个问题吗?如果有人能帮助我找到解决办法,我会很高兴的!
问候,本杰明
答案 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);