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