我一直在制作一种实用工具方法来帮助我找到并正确等待Selenium中的Webelements。到目前为止它还顺利,我有办法尝试各种不同的定位器,等到找到了一个webelement,然后等待直到显示/启用webelement所有的超时和类似的好东西。
问题是我有时需要在页面重新加载后找到Webelements。我已经阅读了有关'陈旧'问题的可用解决方案,我知道如何解决它(使用我刚发现并点击的旧webelement我会等到它再次搜索之前它已经过时了)但我不想要手动必须检查给定的webelement导致页面重新加载。我已经尝试查看Webelement和Expected条件类,看看是否有任何方法在给定的webelement导致页面重新加载时返回true。我试过在这里和谷歌搜索它并没有任何用处。我想知道它是否可能有这样的东西:
Boolean causesPageReload = webElement.causesPageReload;
使用一些名为causesPageReload
的虚构方法确定webelement在单击,提交,等等时导致页面重新加载。我知道一些webelements只会导致javascript在页面上运行而其他人重新加载页面但是如果我可以以编程方式确定它是否重新加载页面我可以说:
if (causesPageReload){
wait.until(ExpectedConditions.stalenessOf("insert old webelement here"));
}
并解决问题。底层的HTML,javascript或者可能已经内置的东西可以提供这些信息吗?当然,我可以自己手动完成这些步骤,看看哪些webelements实际上导致页面刷新,但这可能会发生变化,容易出现人为错误,也很耗时。
或者,我可以用十秒的超时进行我的陈旧检查然后如果它重新加载页面那么好但如果它没有它允许10秒的javascript或其他什么来完成它正在做的事情。 (我也有点想知道如果我需要等待非页面重新加载webelement点击,但这似乎更难,因为javascript并需要一个不同的问题)我不知道如果页面不去,我是否需要等待重装。即使我知道我确实需要在非重载情况下等待,我也不会知道如何。我当前等待只是等待找到,显示和启用webelement所以如果点击它会导致一些重要的事情(我需要等待)但是不会改变那些事情,我需要别的东西,但这需要另一个问题更深入。
我只需要知道我是否可以找出哪些webelements导致页面以编程方式重新加载,如果我不能那么是否需要等待非重新加载(没有必要全面深入了解第二种情况只是告诉我如何问这个问题作为第二个问题)?
我已经尝试过多线程这一点,到目前为止,我已经得到了一些东西可以(及时地)决定在DOM中点击更改或者没有时更改给定元素。这涵盖了大多数页面重新加载的情况,但可能会导致误报,因为我很确定还有其他实例,其中Element引用过时而不涉及页面重新加载。我认为问题的根本原因是没有数据/标志/钩子可以抓住真正告诉。我想一个更好的钩子会导致一个更好的解决方案,但我不知道那个钩子会是什么。从好的方面来说,我确实学习/熟悉了很多多线程,这很好,因为它是一个我一直很弱的领域。我将尝试研究答案中提到的javascript,看看我能不能将它与我的多线程方法结合起来。一旦我有一个好钩子,我需要改变的是WebDriverwait等待对象上的ExpectedConditions调用。
我找到了这个网站: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或者其他一些界面来实现这一点,具体取决于最好的。
虽然这并不能确定给定的webelement导致页面重新加载,但实际上“尝试”它,它确实只是通过“尝试”webelement来确定它。并且,因为我使用了一个主要的线程,我检查“不,它没有重新加载页面”实际上只是可以根据需要配置的超时条件。我不认为可以确定Webelement是否导致页面重新加载而不实际尝试它,但至少我们可以尝试它,确定它是否在超时期限内重新加载然后我们将知道我们将等待足够长的时间到如果我们至少知道我们正在寻找的下一个元素存在于新页面上,那么在搜索相同或下一个元素时不会得到任何陈旧的引用异常(假设一旦我们执行该方法试图找到它,它就会等待要显示和选择所述元素,但我已经这样做了)。这也允许我们通过“尝试”来确定是否从页面中删除了给定的webelement,因为如果我们将javascript pageload调用与我已经拥有的stalereference检查相结合,那么我们可以使用“JS load event didn”的条件t fire(页面静态)但是引发了stalereference excpetion(DOM元素已更改)“检查”此元素被删除/显着更改但页面未重新加载“,这是非常有用的信息。另外,因为这些元素现在可以分为三类:
我们可以预先存储结果并且(只要定位器保持不变)我们可以更容易地知道在点击webelement后我们必须等待或不等。我们甚至可以走得更远,如果我们知道我们有第二种情况,我们可以重新定位元素,看看当我们点击它时它的定位器是否发生变化,因为我认为可以抛出stalereference异常而不需要更改所有定位器。这有用吗?我不确定,但我觉得它非常有用,但我不认为我是第一个尝试/找到解决方案的人。当我成功实现并测试它时,我会发布一个答案,但这将是一段时间,因为我需要学习一些基本的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);
}
您可以使用
WaitElement(pBy, pWait);
结束如果你需要元素可见继续你可以添加is_displayed()
终于不工作你使用java等待:
Thread.sleep(second)
要么
TimeUnit.SECONDS.sleep(second);