给定一个网络元素,单击它是否会导致页面重新加载?

时间:2018-09-12 13:07:25

标签: java selenium selenium-webdriver webpage reload

我在做什么

我一直在寻找一种实用的方法来帮助我找到并正确等待Selenium中的Webelements。到目前为止,它运行良好,我有办法尝试各种不同的定位器,等到找到一个webelement之后再等到该webelement显示/启用时都带有超时和类似的东西。

那是什么问题?

问题是页面重新加载后有时需要查找Webelements。我已经阅读了有关“陈旧性”问题的可用解决方案,并且知道如何解决(使用我刚刚发现并单击的旧的Webelement,我将等到它陈旧之后再进行搜索)但是我不想手动检查给定的webelement是否导致页面重新加载。我尝试在Webelement和Expected条件类中进行查找,以查看是否有任何方法在给定的webelement导致页面重新加载时返回true。我试图在这里和谷歌上搜索它,没有得到任何有用的信息。我想知道是否可能有这样的东西:

Boolean causesPageReload = webElement.causesPageReload;

使用一种名为causesPageReload的假想方法来确定Web元素在单击,提交给对象时是否会导致页面重新加载。我知道有些Webelements只会导致javascript在页面上运行,而另一些webelements会重新加载页面,但是如果我能以编程方式确定它是否重新加载了页面,我只能说:

if (causesPageReload){
    wait.until(ExpectedConditions.stalenessOf("insert old webelement here"));
}

解决问题。基础HTML,JavaScript中是否有任何内容,或者可能已经内置的某些内容可以提供此信息?当然,我可以自己手动完成这些步骤,并查看哪些被测试的Webelements实际上导致页面刷新,但这可能会发生更改,容易出现人为错误并且很耗时。

可能的替代品吗?

或者,我可以用十秒的超时时间来进行陈旧性检查,然后如果它重新加载页面就可以了,但是如果没有,那么它可以让javascript或其他任何东西完成操作的时间为10秒。 (我也有点想知道是否还需要等待非页面重新加载webelement点击,但是由于JavaScript的原因,这似乎更加困难,并且会出现一个不同的问题)我不知道是否需要等待该页面是否停止重新加载。即使我知道在非重装情况下确实需要等待,我也不知道该如何做。我当前的等待只是等待找到,显示和启用该webelement,因此,如果单击它会导致一些重要的事情(我需要等待),但又没有改变那些事情,那么我需要其他的事情,但这需要另一个问题更深入。

Tl:Dr

我只需要知道是否可以找到哪些Webelements可以以编程方式重新加载页面,如果不能,那么是否有必要等待非重新加载的页面(无需深入研究第二种情况)请告诉我稍后再问第二个问题)?

更新

我已经尝试过对此进行多线程处理,到目前为止,我已经获得了一些可以(及时)决定在单击DOM中的更改时是否更改给定元素的东西。这涵盖了大多数页面重新加载的情况,但可能会导致误报,因为我敢肯定,在其他实例中,Element引用过时,并且不涉及页面重新加载。我认为问题的根本原因是没有数据/标志/钩子可以真正抓住。我想更好的钩子会导致更好的解决方案,但我不知道那个钩子会是什么。从好的方面来说,我确实学习/熟悉了很多多线程技术,这是一件好事,因为它是我一直薄弱的一个方面。我将尝试研究答案中提到的javascript,看看我是否不能结合我的多线程方法。一旦有了一个好的钩子,我需要做的就是更改WebDriverwait等待对象上的ExpectedConditions调用。

更新2

我找到了这个网站: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded

详细介绍“ load”和“ DOMcontentloaded”事件。当页面加载/重新加载时,javascript中有两件事会触发。我已经用ExpectedConditions创建了一个线程应用程序,如下所示:

WebDriverWait wait = new WebDriverWait(driver,timeoutSeconds);
        try{
            wait.until(ExpectedConditions.stalenessOf(webElement));
        }
        catch (TimeoutException e){  
        }

因此,我非常确定我可以修改wait.until行,以使用Java到Javascript界面​​检查是否超时触发javascript事件。为了同时使用这两种语言,我被问到了这个问题:

How can I use JavaScript in Java?

为了使人们了解基本的工作原理。我将尝试使用Nashorn或其他一些接口来实现,这取决于最好的方法。

这可能意味着什么

虽然这并不能确定给定的Web元素是否导致页面重新加载,然后才真正“尝试”它,但它确实是通过“尝试”该Web元素来确定页面的。而且,由于我使用的是主线程之外的线程,因此检查“不,它没有重新加载页面”实际上就是可以根据需要配置的超时条件。我认为不可能在没有实际尝试的情况下确定Webelement是否导致页面重新加载,但是至少我们可以尝试一下,确定它是否在超时时间内重新加载,然后我们将知道我们已经等待了足够长的时间以至于如果我们至少知道我们要查找的下一个元素存在于新页面上,则在搜索相同或下一个元素时不会获得任何过时的引用异常(假设一旦执行该方法尝试查找该元素,它将等待以便显示和选择所述元素,但我已经做到了)。这也使我们能够通过“尝试”来确定是否从页面中删除了给定的webelement,因为如果我们将javascript pageload调用与我已经拥有的stalereference检查结合起来,那么我们可以使用“ JS load event not”的条件。发射(页面静态)但抛出过时引用异常(DOM元素已更改),因为检查“此元素已被删除/显着更改,但页面未重新加载”,这是非常有用的信息。另外,由于这些元素现在可以分为三类:

  1. 不会被删除,可以再次引用
  2. 已删除但页面静态
  3. 已删除,但页面已更改

我们可以预先存储结果,并且(只要定位符保持不变),我们可以更轻松地知道单击该webelement之后是否必须等待。我们甚至可以走得更远,如果我们知道有第二种情况,我们可以重定位元素,并单击它时看看它的定位符是否改变,因为我认为可以引发过时引用异常,而无需更改所有定位符。这有多有用?我不确定,但我认为它非常有用,但是我不认为我是第一个为此尝试/找到解决方案的人。当我成功实现并测试该问题时,我会发布一个答案,但这将是一段时间了,因为我需要学习一些基本的Javascript,然后再将其与Java集成。

1 个答案:

答案 0 :(得分:0)

您可以使用

WaitElement(pBy, pWait);

结束,如果您需要在元素可见的情况下继续,则可以添加is_displayed()

最终无法正常工作,您使用了java wait:

Thread.sleep(second)

TimeUnit.SECONDS.sleep(second);