我正在使用selenium / firefox / c#将数据输入网页的多个字段,然后点击提交按钮将其提交到网站。我尝试使用ImplicitlyWait
,以便程序等待结果页面加载最多45秒,然后从该页面获取结果。我现在把它编码为
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(45));
driver.FindElement(By.Id("dnn_ctr1734_Professional_btnSubmit")).Click();
我在单击提交按钮之前进行隐式等待,但即使页面加载时它只需要15秒,但最终加载时不会抓取结果。我是否按正确的顺序排列了ImplicitWait
?
答案 0 :(得分:4)
初始化驱动程序后,通常可以正确放置隐式等待的位置。它基本上作为操作完成的默认等待时间。
有几种方法可以解决您的问题...
使用具有预期条件的显式等待,等待忙碌的微调器消失。
var wait = new WebDriverWait(Driver.Instance,TimeSpan.FromSeconds(10)); wait.Until(driver =>!driver.FindElement(By.Id(“busySpinnerID”))。显示);
等到页面上显示特定元素
var wait = new WebDriverWait(Driver.Instance,TimeSpan.FromSeconds(10)); wait.Until(driver => driver.FindElement(By.Id(“knownElementId”))。显示);
使用JavaScript等待页面加载
var wait = new WebDriverWait(driver,TimeSpan.FromSeconds(30)); wait.Until(driver1 =>((IJavaScriptExecutor)驱动程序).ExecuteScript(“return document.readyState”)。Equals(“complete”));
答案 1 :(得分:0)
您应该使用显式等待,使用如下代码:
>>> test = "Byggår"
>>> key = raw_dict.keys()[7]
>>> print(test)
Byggår
>>> print(key)
Byggår
>>> test
'Bygg\xc3\xa5r'
>>> key
u'Bygg\xe5r'
>>> raw_dict[test]
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd_exec.py", line 3, in Exec
File "<input>", line 1, in <module>
KeyError: 'Bygg\xc3\xa5r'
答案 2 :(得分:0)
我同意Dmitry的观点,处理等待的最佳方法是使用显式等待函数。为了让您的生活更轻松,您可以将其添加到扩展方法中,这样您就可以在点击之前等待元素存在。例如:
Class Actions {
public static IWebDriver ClickOn(IWebDriver driver, string button)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementExists(By.XPath(button)));
driver.FindElement(By.XPath(button)).Click();
return driver;
}
}
然后您的代码可以像
一样简单Actions.ClickOn(d, SignInButton);
在点击之前,您的代码仍将等待元素存在。