在实际工作中我们常常会遇到需要判断一个页面真的加载完毕,然后我们才能放心的去做其他事情,有哪些办法能做到这点呢,这些办法真的始终都有效吗?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原创文章,未经允许禁止转载。 |