当它执行发送键时,您将看到该城市的名称显示,并清除所有该命令。我把等待添加只是为了检查。有办法解决这个问题吗?它不会失败,因为它找到了该字段,然后清除它。它不能是javascript,因为我没有离开该字段,我还没有发现任何代码被'keystroke'调用。
try
{
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementExists((By.Id("city"))));
var city = Driver.Instance.FindElement(By.Id("city"));
//Task.Delay(10000).Wait();
city.SendKeys(City);
//Task.Delay(10000).Wait();
}
catch (StaleElementReferenceException ex)
{
var city = Driver.Instance.FindElement(By.Id("city"));
City.SendKeys(City);
}
上面的城市是一处房产。
答案 0 :(得分:0)
我通常会等待元素可见,活跃且可编辑,而不仅仅是因为它存在于DOM中。
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city"))));
有关详细信息,请参阅ExpectedConditions#elementToBeClickable。
当清除字段时,似乎触发了onchange或oninput事件,并且某些javascript代码修改了此元素。
首先尝试使用此代码 - 每次在执行每个操作之前等待元素:
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).clear();
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).SendKeys(City);
如果它仍然不起作用,那么使用蛮力方法 - 在循环中尝试几次:
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).clear();
for( int i = 5; i >=0; i--){
try{
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city")))).SendKeys(City);
break;
}catch( StaleElementReferenceException ex ){
if( i <= 0 ){
throw ex;
}else{
// swallow the exception, wait some time and try again
Utils.silentSleep( 500 );
}
}
其中Utils.silentSleep是:
static void silentSleep( long ms ){
try{
Thread.sleep( ms );
}catch( Exception ex ){
}
}