我一直在做一个实用方法来帮助我找到并适当地等待硒中的Webelements。到目前为止,它进展顺利,我有办法尝试各种不同的定位器,等待直到一个webelement被找到,然后等待直到webelement被显示/启用所有的超时和类似的美好事情。
问题是我有时需要在页面重新加载后找到Webelements。我已经阅读了关于“陈旧性”问题的可用解决方案,我知道如何解决它(使用我刚刚找到并点击的旧webelement,我会等到它陈旧后再重新搜索),但我不想手动检查给定的webelement是否导致页面重新加载。我试着在Webelement和Expected conditions类中查找,看看如果给定的Webelement导致页面重新加载,是否有返回true的方法。我试着在这里和谷歌上搜索它,但没有任何有用的结果。我想知道是否可能有这样的东西:
Boolean causesPageReload = webElement.causesPageReload;
使用一个名为causespagereload
的虚构方法,该方法确定一个webelement在单击、提交等时是否会导致页面重新加载。我知道有些webelements只是导致javascript在页面上运行,而另一些webelements则重新加载页面,但如果我可以通过编程确定它是否重新加载页面,我可以说:
if (causesPageReload){
wait.until(ExpectedConditions.stalenessOf("insert old webelement here"));
}
并解决问题。在底层的HTML、javascript或者是已经内置的东西中有什么东西可以提供这些信息吗?当然,我可以自己手动完成这些步骤,看看哪些测试中的webelements实际上会导致页面刷新,但这可能会发生变化,容易出现人为错误,而且还会耗费时间。
或者,我可以用10秒的超时时间来进行陈旧性检查,然后,如果它重新加载页面,这也很好,但如果它不加载,它会给javascript或其他工具10秒的时间来完成它正在做的事情。(我也有点想知道我是否需要等待非页面重新加载的webelement点击,但由于javascript的缘故,这似乎更难,并带来了一个不同的问题)我不知道如果页面不重新加载,我是否需要等待。即使我知道我确实需要等待在不重新装载的情况下,我也不知道如何。我当前的等待只是等待webelement被找到、显示和启用,所以如果点击它导致了一些重要的事情(我需要等待)但没有改变这些事情,我需要一些其他的东西,但这需要另一个问题来更深入。
我只需要知道,如果我可以找出哪些webelements导致页面以编程方式重新加载,如果我不能,那么有没有必要等待未重新加载的页面(不需要深入讨论第二种情况,只需要告诉我如何问这个问题作为第二个问题)?
我已经尝试了多线程化,到目前为止,我已经获得了一些东西,可以(及时地)决定单击时给定元素是否在DOM中发生变化。这涵盖了大多数页面重新加载的情况,但可能会导致误报,因为我非常肯定还有其他一些不涉及页面重新加载的元素引用过时的情况。我认为问题的根本原因是没有数据/标志/钩子可以抓取来真正判断。我想一个更好的钩子会导致一个更好的解决办法,但我不知道那个钩子会是什么。从好的方面来看,我确实学到了/熟悉了很多多线程,这很好,因为这是我比较薄弱的领域。我将尝试研究答案中提到的javascript,看看是否不能将其与多线程方法结合起来。一旦我有了一个好的钩子,我需要更改的只是对WebDriverwait等待对象的ExpectedConditions调用。
我找到了这个网站:https://developer.mozilla.org/en-us/docs/web/events/domcontentloaded
其中详细说明了“Load”和“DomContentLoaded”事件。javascript中的两个内容在加载/重新加载页面时触发。我已经创建了一个具有如下预期条件的线程应用程序:
WebDriverWait wait = new WebDriverWait(driver,timeoutSeconds);
try{
wait.until(ExpectedConditions.stalenessOf(webElement));
}
catch (TimeoutException e){
}
因此,我非常肯定我可以修改wait.until行,以使用Java到javascript接口检查是否有超时javascript事件触发。为了把这两种语言结合起来使用,我想到了这个问题:
如何在Java中使用JavaScript?
以便了解它的基本工作原理。我将尝试使用Nashorn或其他接口来实现这一点,这取决于什么是最好的接口。
虽然这并不能决定我们是否一个给定的webelement会在实际“尝试”之前导致页面重新加载,但它可以通过“尝试”webelement来决定。而且,因为我使用了一个线程off of main,所以我对“no it didnot reload the page”的检查实际上只是超时条件,可以根据需要进行配置。我不认为不实际尝试就能确定Webelement是否导致页面重新加载,但至少我们可以尝试它,确定它是否在超时时间内重新加载,然后我们就会知道,如果我们至少知道我们要查找的下一个元素存在于新页面上,我们就会等待足够长的时间,在搜索相同的元素或下一个元素时不会得到任何过时的引用异常(假设一旦我们执行方法试图定位它,它就会等待所述元素显示并可选择,但我已经这样做了)。这还允许我们通过“尝试一下”来确定给定的webelement是否从页面中删除了,因为如果我们将javascript pageload调用与我已经有的stalereference检查结合起来,那么我们就可以使用“JS load event未激发(页面静态)但stalereference Expetion被抛出(DOM元素已更改)”的条件作为“该元素已显著删除/更改但页面未重新加载”的检查,这是非常有用的信息。此外,由于这些元素现在可以分为三类:
我们可以预先存储结果,并且(只要定位器保持完整)我们可以更容易地知道在点击WebElement之后我们是否必须等待。我们甚至可以更进一步,如果我们知道我们有第二种情况,我们可以重试定位元素,看看当我们单击它时它的定位器是否改变,因为我认为可以抛出stalereference异常而不需要改变所有的定位器。这有多有用?我不确定,但我认为这是相当有用的东西,但不知何故,我不认为我是第一个尝试/找到解决方法的人。当我成功地实现并测试了它时,我会发布一个答案,但这还需要一段时间,因为我需要学习一些基本的Javascript,然后再学习如何将其与我的Java集成。
没有任何方法可以通过编程来确定单击是否会导致重新加载。
您需要分别使用每种情况,为此,您可以创建带有重载(或不重载)的mainclick()
方法,并在每种情况下调用相应的方法
public void clickOnElement(WebElement element, boolean waitForStaleness) {
element.click();
if (waitForStaleness) {
wait.until(ExpectedConditions.stalenessOf(element));
}
}
public void clickOnElement(WebElement element) {
clickOnElement(element, false);
}
问题内容: 快速的问题,我已经尝试自己弄清楚这一点,但是在试图弄清页面为什么或如何重新加载以及正在/不应该执行其应做的工作时,使用会话变量可能会造成混淆。 在任何(非脚本)情况下,页面重新加载(使用JavaScript,f5,ctrl + f5,浏览器重新加载按钮等)是否会导致表单重新发布? (这与在C#代码中使用IfPost分支有关,例如下面的示例代码): 我只是需要知道在这里期望什么,以便可以
我在上使用jQuery的和函数来编码或模拟不同的连续表单节。 更奇怪的是,上面提到的这个问题,如果你在点击“Continuar”按钮之前点击导航栏文本(然后不需要重新加载并再次显示第一页就会出现预期的页面),就不会发生。 表格可在此浏览: 下面是相关的JavaScript代码: 这是正文标记:
问题内容: 我正在研究一个使用Angularjs和Twitter Bootstrap的项目。 Bootstrap使用#来切换组件(例如,弹出框,模式框等): 问题是当我单击具有href属性的按钮时,它会导致整个页面重新加载,这意味着当前页面中的所有内容都会丢失。 有办法防止这种情况吗? 一些 额外的 信息: 当我将鼠标悬停在按钮上时,URL很奇怪。例如,我当前页面的网址是 该按钮的href为 我希
问题内容: 我有一个带有php include的Div Tag,该div用来填充该信息,我想要做的是使它每隔15秒调用一次,以便它可以在那里更新信息,而不必重新加载整个网页。我试图用JavaScript / jQuery做到这一点,但似乎无法正常工作 这是我在搜索一些内容后所拥有的,然后发生的是,它加载了Small.php,但不会每15秒刷新一次或更新信息。 请帮忙! 我应该添加所有应显示的php
基本上,我想自动化谷歌搜索引擎,基本上搜索和点击第一个链接,搜索按钮被点击后填充,所以我用python做这件事。我能够成功地搜索内容,但无法在重新加载页面后单击链接 这个输入类我用的名字是q 这是我的目标链接文本中的html代码,它是K.J.Somaiya Inst。。。。。
我有一个Angular的表单,里面有两个按钮标签。一个按钮提交上的表单。另一个按钮是纯导航使用。然而,当点击第二个按钮时,AngularJS会导致页面刷新,从而触发404。我在函数中删除了一个断点,它正在触发我的函数。如果我执行以下任何操作,它将停止: 如果我删除,则该按钮不会导致页面刷新 如果我注释掉函数中的代码,它不会导致页面刷新 如果我将按钮标记更改为锚定标记(