Gir*_*ish 124 selenium load document wait
任何人都可以让我如何让硒等到页面完全加载的时候?我想要一些通用的东西,我知道我可以配置WebDriverWait并调用类似'find'的东西让它等待,但我不会那么远.我只需要测试页面加载成功并转到下一页进行测试.
我在.net中找到了一些东西但是无法在java中使用它...
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"));
Run Code Online (Sandbox Code Playgroud)
有人想过吗?
Pet*_*ček 84
您建议的解决方案只等待DOMreadyState
发出信号complete
.但Selenium默认尝试通过driver.get()
和element.click()
方法等待页面加载的那些(以及更多一点).他们已经阻止,他们等待页面完全加载,那些应该正常工作.
显然,问题是通过AJAX请求和运行脚本重定向 - 这些不能被Selenium捕获,它不会等待它们完成.此外,您无法通过readyState
它可靠地捕获它们- 它等待一点,这可能很有用,但它会complete
在下载所有AJAX内容之前发出信号.
没有通用的解决方案可以在任何地方和每个人工作,这就是为什么它很难,每个人都使用一些不同的东西.
一般规则是依靠WebDriver来完成他的工作,然后使用隐式等待,然后使用显式等待你想在页面上断言的元素,但是还有更多的技术可以完成.您应该在测试页面上选择最适合您情况的一个(或其中几个组合).
有关详细信息,请参阅我的两个答案:
Man*_*dan 79
试试这段代码:
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
上面的代码将等待最多10秒的页面加载.如果页面加载超过它将抛出的时间TimeoutException
.你抓住了例外,满足了你的需求.我不确定是否在抛出异常后退出页面加载.我还没有尝试这个代码.想要尝试一下.
这是一个隐含的等待.如果你设置了一次它将具有范围,直到Web驱动程序实例销毁.
有关更多信息.
小智 60
这是您给出的示例的可用Java版本:
void waitForLoad(WebDriver driver) {
new WebDriverWait(driver, 30).until((ExpectedCondition<Boolean>) wd ->
((JavascriptExecutor) wd).executeScript("return document.readyState").equals("complete"));
}
Run Code Online (Sandbox Code Playgroud)
示例对于c#:
public static void WaitForLoad(IWebDriver driver, int timeoutSec = 15)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSec));
wait.Until(wd => js.ExecuteScript("return document.readyState").ToString() == "complete");
}
Run Code Online (Sandbox Code Playgroud)
hwj*_*wjp 11
这是我在Python中尝试完全通用的解决方案:
首先,一个通用的"等待"函数(如果你愿意,可以使用WebDriverWait,我发现它们很难看):
def wait_for(condition_function):
start_time = time.time()
while time.time() < start_time + 3:
if condition_function():
return True
else:
time.sleep(0.1)
raise Exception('Timeout waiting for {}'.format(condition_function.__name__))
Run Code Online (Sandbox Code Playgroud)
接下来,该解决方案依赖于selenium为页面上的所有元素(包括顶级元素)记录(内部)id号的事实<html>
.当页面刷新或加载时,它会获得一个带有新ID的新html元素.
因此,假设您要单击带有文本"我的链接"的链接,例如:
old_page = browser.find_element_by_tag_name('html')
browser.find_element_by_link_text('my link').click()
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
Run Code Online (Sandbox Code Playgroud)
对于更多Pythonic,可重用的通用助手,您可以创建一个上下文管理器:
from contextlib import contextmanager
@contextmanager
def wait_for_page_load(browser):
old_page = browser.find_element_by_tag_name('html')
yield
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
Run Code Online (Sandbox Code Playgroud)
然后你可以在任何硒交互中使用它:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
Run Code Online (Sandbox Code Playgroud)
我认为那是防弹的!你怎么看?
我遇到了类似的问题.我需要等到我的文档准备就绪,直到所有Ajax调用完成.事实证明第二个条件很难被发现.最后,我检查了活动的Ajax调用,并且它工作正常.
使用Javascript:
return (document.readyState == 'complete' && jQuery.active == 0)
Run Code Online (Sandbox Code Playgroud)
完整的C#方法:
private void WaitUntilDocumentIsReady(TimeSpan timeout)
{
var javaScriptExecutor = WebDriver as IJavaScriptExecutor;
var wait = new WebDriverWait(WebDriver, timeout);
// Check if document is ready
Func<IWebDriver, bool> readyCondition = webDriver => javaScriptExecutor
.ExecuteScript("return (document.readyState == 'complete' && jQuery.active == 0)");
wait.Until(readyCondition);
}
Run Code Online (Sandbox Code Playgroud)
小智 6
WebDriverWait wait = new WebDriverWait(dr, 30);
wait.until(ExpectedConditions.jsReturnsValue("return document.readyState==\"complete\";"));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
343430 次 |
最近记录: |