在实际工作中我们常常会遇到需要判断一个页面真的加载完毕,然后我们才能放心的去做其他事情,有哪些办法能做到这点呢,这些办法真的始终都有效吗?SuperXi今天就带大家一起来探讨这个问题。

如果你基本功扎实,你应该很自然的会想到 :

driver.manage().timeouts().pageLoadTimeout(0,TimeUnit.SECONDS);

这里时间设为0表示会一直等到页面加载完毕,只要页面没有加载完毕就会一直等下去。

driver.manage().timeouts().pageLoadTimeout(15,TimeUnit.SECONDS);

如果把时间设为15秒,那意味着如果你的页面在15秒内没有加载完毕,将会抛出WebDriverException的异常

一切看上去都很不错,的确是这样,如果你自动化加载的页面是一个纯粹的静态页面,确实很完美,不会出任何问题。但是它真的始终都会完美的在任何页面都能正常的工作下去吗?SuperXi告诉你,答案是否定的,对于一个javascript运用很多的网站来说,它是会出问题的。


可能有的人会耍小聪明,我们用Javascript,用 Javascript代码来判断DOM是否加载完毕

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

wait.Until(driver1=>((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

的确,这也是一种办法,但你不要高兴过早,SuperXi很遗憾的告诉你这个方法对于JavaScript运用比较多的现代化的网站来说是没有意义的。

所以你可以这么理解,Selenium提供的方法并不保证你的页面真的会被加载完毕,这只能算它的猜测,具体如何真的确定网页是否加载完毕其实还是得靠你自己

可能有的初学者甚至还会回答用:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

这个绝对是要恶补selenium知识的,首先SuperXi的忠告是尽量少用隐式等待,如果一定要用还必须是需要有条件的用,否则会出问题的,具体的这些坑在SuperXi提供的selenium系列课程中会详细讲解

如果你等待页面加载是为了点击某个元素,那你可以考虑用显式等待

WebDriverWait wait = new WebDriverWait(driver, 40);

wait.until(ExpectedConditions.elementToBeClickable(By.id("yourid")));

当然你需要考虑的并不仅仅这些,真正能解决问题的手段也有很多,需要针对不同的情况有针对性的处理,如果你想深入系统的学习,如果以上这些知识对你来说还是很模糊,赶紧去找我们的课程顾问系统深入的学习下吧。


SuperXi


版权声明:本文为AutotestOps原创文章,未经允许禁止转载。