当它执行发送密钥时,您将看到城市的名称显示并清除,所有这些都来自该命令。我添加了等待只是为了检查。有什么方法可以解决这个问题吗?它不会失败,因为它会找到该字段,然后将其清除。它不可能是javascript,因为我没有离开该字段,也没有发现任何代码被"击键"调用。
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);
}
上面的城市是一个财产。
我通常等待元素可见、活跃和可编辑,而不仅仅是它在 DOM 中的存在。
wait.Until(ExpectedConditions.elementToBeClickable((By.Id("city"))));
有关详细信息,请参阅预期条件#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 ){
}
}