Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定一个webelement,单击它是否会导致页面重新加载? 我在做什么_Java_Selenium_Selenium Webdriver_Webpage_Reload - Fatal编程技术网

Java 给定一个webelement,单击它是否会导致页面重新加载? 我在做什么

Java 给定一个webelement,单击它是否会导致页面重新加载? 我在做什么,java,selenium,selenium-webdriver,webpage,reload,Java,Selenium,Selenium Webdriver,Webpage,Reload,我一直在做一个实用的方法来帮助我在Selenium中找到并正确地等待Webelements。到目前为止进展顺利,我有办法尝试各种不同的定位器,等待找到一个webelement,然后等待,直到webelement显示/启用,都有超时和类似的好东西 那有什么问题? 问题是,我有时需要在重新加载页面后查找Webelements。我已经阅读了关于“过时”问题的可用解决方案,我知道如何解决它(使用我刚刚找到并单击的旧webelement,我会等到它过时后再搜索)但是我不想手动检查给定webelement是

我一直在做一个实用的方法来帮助我在Selenium中找到并正确地等待Webelements。到目前为止进展顺利,我有办法尝试各种不同的定位器,等待找到一个webelement,然后等待,直到webelement显示/启用,都有超时和类似的好东西

那有什么问题? 问题是,我有时需要在重新加载页面后查找Webelements。我已经阅读了关于“过时”问题的可用解决方案,我知道如何解决它(使用我刚刚找到并单击的旧webelement,我会等到它过时后再搜索)但是我不想手动检查给定webelement是否会导致页面重新加载。我试着查看Webelement和Expected conditions类,看看如果给定的Webelement导致页面重新加载,是否有返回true的方法。我试着在这里和谷歌上搜索,但没有得到任何有用的信息。我想知道是否可能有这样的东西:

Boolean causesPageReload = webElement.causesPageReload;
使用名为
causespage load
的虚构方法,该方法确定当单击、提交到等Web元素时,是否会导致页面重新加载。我知道有些webelements只会导致javascript在页面上运行,而另一些会重新加载页面,但如果我可以通过编程确定它是否会重新加载页面,我可以说:

if (causesPageReload){
    wait.until(ExpectedConditions.stalenessOf("insert old webelement here"));
}
解决问题。底层的HTML、javascript或者已经内置的东西中是否有任何东西可以提供这些信息?当然,我可以自己手动完成这些步骤,看看测试中的哪些webelements实际上会导致页面刷新,但这可能会发生更改,很容易出现人为错误,也很耗时

可能的替代方案? 或者,我可以在超时10秒的情况下进行过时检查,然后如果它重新加载页面,这很好,但如果没有,则允许10秒的时间让javascript或其他任何东西完成它正在做的事情。(我也有点想知道是否需要等待非页面重新加载的webelement点击,但由于javascript的原因,这似乎更难,并且需要一个不同的问题)我不知道如果页面不重新加载,我是否需要等待。即使我知道在非重新加载的情况下我确实需要等待,我也不知道如何等待。我当前的等待只是等待webelement被找到、显示和启用,所以如果单击它会导致一些重要的事情(我需要等待),但没有改变这些事情,我需要一些其他的东西,但这需要另一个更深入的问题

Tl:Dr 我只想知道我是否能找出哪些webelements导致页面以编程方式重新加载,如果不能,那么是否需要等待非重新加载的页面(无需深入了解第二种情况,请稍后告诉我如何作为第二个问题提问)

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

更新2 我发现这个网站:

其中详细说明了“加载”和“DOMcontentloaded”事件。在javascript中,当页面被加载/重新加载时会触发两件事。我已经创建了一个线程应用程序,其预期条件如下:

WebDriverWait wait = new WebDriverWait(driver,timeoutSeconds);
        try{
            wait.until(ExpectedConditions.stalenessOf(webElement));
        }
        catch (TimeoutException e){  
        }
因此,我非常确定我可以修改wait.until行,使用Java-to-javascript接口检查超时触发的javascript事件。为了同时使用这两种语言,我被引导到这个问题:

为了让奥巴丁知道这基本上是如何工作的。我将尝试使用Nashorn或其他一些接口来实现这一点,具体取决于什么是最好的

这可能意味着什么 虽然对于我们来说,这并不能确定一个给定的webelement是否会在实际“尝试”它之前导致页面重新加载,但它只是通过“尝试”webelement来确定。而且,因为我使用了main的线程,我对“no it not reload the page”的检查实际上只是超时条件,可以根据需要进行配置。我认为在没有实际尝试的情况下,不可能确定Webelement是否会导致页面重新加载,但至少我们可以尝试一下,确定它是否在超时时间内重新加载,然后我们将知道,在搜索相同或下一个元素时,如果我们至少知道我们要查找的下一个元素存在于新页面上,我们将等待足够长的时间,以避免出现任何陈旧的引用异常(假设一旦我们执行该方法来尝试定位它,它就会等待所述元素被显示和选择,但我已经这样做了)。这也允许我们通过“尝试”来确定给定的webelement是否已从页面中删除因为如果我们将javascript pageload调用与我已有的stalereference检查结合起来,那么我们可以使用“JS加载事件未触发(页面静态),但抛出了stalereference excpetion(DOM元素已更改)”的条件作为“此元素已显著删除/更改,但页面未重新加载”的检查,这是非常有用的信息。此外,由于这些元素现在可以分为三类:

  • WaitElement(pBy, pWait);
    
    Thread.sleep(second)
    
    TimeUnit.SECONDS.sleep(second);
    
    public void clickOnElement(WebElement element, boolean waitForStaleness) {
        element.click();
        if (waitForStaleness) {
            wait.until(ExpectedConditions.stalenessOf(element));
        }
    }
    
    public void clickOnElement(WebElement element) {
        clickOnElement(element, false);
    }