java - 给定一个webelement,单击它会导致页面重新加载吗?

标签 java selenium selenium-webdriver webpage reload

我在做什么

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

那是什么问题呢?

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

Boolean causesPageReload = webElement.causesPageReload;


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

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


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

可能的替代方案?

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

Tl:博士

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

更新资料

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

更新2

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

其中详细说明了“加载”和“ 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”的条件。射击(页面静态)但引发了Stalereference异常(DOM元素已更改),因为检查“此元素已被重大删除/更改,但未重新加载页面”,这是非常有用的信息。另外,由于这些元素现在可以分为三类:


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


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

最佳答案

没有任何方法可以通过编程方式确定点击是否会导致重新加载。

您需要分别使用每种情况,为此,您可以创建带有或不带有重载的主click()方法,并在每种情况下调用相应的方法

public void clickOnElement(WebElement element, boolean waitForStaleness) {
    element.click();
    if (waitForStaleness) {
        wait.until(ExpectedConditions.stalenessOf(element));
    }
}

public void clickOnElement(WebElement element) {
    clickOnElement(element, false);
}

关于java - 给定一个webelement,单击它会导致页面重新加载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52295999/

相关文章:

python - RemoteDisconnected ("Remote end closed connection without"http.client.RemoteDisconnected : Remote end closed connection without response

java - JPA 标准 API : Aggregating on Multiple Columns with IF Condition

java - Excel 数据未填充到 Web 表单中

python - 使用 Selenium 清除html输入框

java - 如何使用 POI 从 Excel 文件单元格获取数字和字符串值,我收到数字值错误,字符串值轻松获取

c# - 使用 C# 和 selenium 网格进行并行测试

java - Lucene:新的 WordnetSynonymParser( boolean 去重、 boolean 展开、Analyzer 分析器)

java - Eclipse/Spring/Tomcat 6 的奇怪字符编码问题

java - 编译sample.java和jgraph_5.8.3.1.jar

java - 如何用selenium获取文本同级标签?