【问题标题】:Scrolling a page with AJAX content loading Selenium Webdriver使用 AJAX 内容滚动页面加载 Selenium Webdriver
【发布时间】:2013-07-12 14:42:11
【问题描述】:

我正在使用 Selenium Webdriver 来获取网页的内容。当用户使用 AJAX 向下滚动时,页面会加载更多内容。我可以使用 javascript 向下滚动,但不知道何时停止滚动。我怎么知道什么时候不能再向下滚动?我不能使用 document.clientheight 或任何高度属性,因为当窗口太小但元素都附加到 DOM 时它们处理滚动,因此它们的高度是已知的。在这里,元素是动态附加到 DOM 的,所以高度是事先不知道的。

我怎么知道我什么时候到达了谷底?某处是否有“滚动条不可滚动”条件?或者,如果正在加载更多内容并且滚动条还不能滚动,但很快就会触发,这也会触发吗?

谢谢, bsg

更新

对我有用的答案实际上是针对我的另一个问题(这个问题是那个问题的一个更精确的子集)。即,使用 jquery 测试以下等价性: $(document).height() == ($(window).height() + $(window).scrollTop();。如果它的计算结果为 true,则您已经达到页面底部。(有关此工作原理的解释,请参阅Meaning of $(window).scrollTop() == $(document).height() - $(window).height())我不确定这是否可以在没有 jquery 的情况下工作,所以如果您正在测试的页面没有 jquery,您可能应该使用user1177636 的回答如下。

我使用的确切代码是:

JavascriptExecutor js = (JavascriptExecutor)driver;
do{

  //scroll down and do whatever processing you need

  reachedbottom = Boolean.parseBoolean(js.executeScript("return $(document).height() == ($(window).height() + $(window).scrollTop());").toString());

  }while(!reachedbottom);

希望这对某人有所帮助。

【问题讨论】:

  • 一旦它到达底部,你下一步做什么?如果这是可行的,则停止滚动。这个逻辑适合你吗?
  • 希望如此。我正在滚动以获取页面上的所有项目,当我到达底部时,我想对检索到的项目进行一些处理。由于它们没有唯一的 ID 或名称,我迫不及待地想知道我是否已经到达底部。
  • 检查readyState=complete怎么样?
  • 我正在尝试编写代码来尝试您的建议,但不幸的是,我对 JS 并不是很熟悉。您能否准确指定 readyState 是哪个对象的属性?从搜索来看,似乎不止一个。我会将其放入 WebDriver 等待中吗?我如何让它等待执行 JS(如果是这样的话)?

标签: javascript ajax selenium scroll webdriver


【解决方案1】:

由于 OP 想让我在这里做出回应,我会尝试写下一些东西,但可能不是这个问题的正确答案。

首先,我需要知道您的网站是否无限滚动,例如Flickr Explore

如果它是无止境的,那么我怀疑它什么时候会结束。您只能检查一个特定元素是否存在(这不是您的情况,对吧?)。

但是,如果您的网站将在某个时候结束,您可以继续滚动,如果 readyState!=complete

由于您没有说明您使用的是什么语言,我将在 C# 中进行说明。

bool readyStateComplete = false;
while (!readyStateComplete) {
    IJavaScriptExecutor executor = driver as IJavaScriptExecutor;
    executor.ExecuteScript("window.scrollTo(0, document.body.offsetHeight)");
    readyStateComplete = (string)executor.ExecuteScript("return document.readyState") == "complete";
}

【讨论】:

  • 感谢您的示例。我实际上正在使用 Java,但应该能够翻译。幸好我的网站不是无休止的滚动,所以这应该可以。但是,我仍然遇到的问题是,如果我滚动得太快,内容加载速度不够快,最终会出现 StaleElementExceptions。 (至少,这就是我认为是错误的原因,因为当我单步执行每一行时它不会发生。)有没有办法等待 readyState 完成?那行得通吗?我应该就这个特定问题提出一个新问题吗?
  • StaleElementException 扔到哪里去了?只要不涉及任何元素,我认为JavaScriptExecutor 不会关心这一点。
  • 我最初的答案是等待 readyState 完成,然后意识到它不起作用。因为即使不在底部也会完成,然后你再次滚动,页面加载,然后readyState=complete,然后你仍然可以再次向下滚动。
  • 对不起 - 我不清楚。我有几个问题,我把它们放在一个问题中,然后我把这个问题放在一个单独的问题中。您已经回答了这个问题,但我希望您的原始答案能帮助我解决我遇到的另一个问题。 (也就是说,我的内容加载速度不够快,所以在它完成加载之前尝试访问它会导致错误。我需要一些方法来等待它完成加载。)
  • 我会接受你的答案,因为它应该可以工作,但我实际上使用了另一个问题的答案,我将在此处添加。谢谢!
【解决方案2】:

我遇到了同样的问题。我刚刚执行了 $('.footer').scrollIntoView() js滚动到底部。

【讨论】:

  • 感谢您的回复,但这对我不起作用,因为我需要一次向下滚动一个屏幕并从页面中检索一些元素。我实际上在我的另一个问题上得到了答案(其中包括这个问题,但更笼统),但我不打算关闭这个问题,因为我想看看 user1177636 是否会回答我的问题上面的评论。
  • 最可靠的方法是在滚动到底部时调用页面上的javascript函数并附加元素。
猜你喜欢
  • 2013-07-08
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多