2016-08-05 176 views
0

我是使用硒Webdriver并编写c#的新手。我在脚本中使用了很多thread.sleep()命令来确保Selenium不会尝试点击太快。在大量的研究,我发现这是令人难以接受的,并有“更好”的方式来做到这一点,所以我开始使用: -Selenium c#wait.until(expectedconditions)...函数无法在屏幕上找到对象/元素

wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("FieldId"))); 

等待在另一个类中定义为: -

wait = new WebDriverWait(driver, new TimeSpan(0, 0, 0, 10)); 

我只能得到这个工作运行脚本的2/10倍没有得到:

没有这样的元素例外:无法找到元素......

我现在有很多这个问题的例子,我已经停止使用thread.sleep。经过大量的研究,我总是发现这是建议的方式,但它似乎完全不可靠。我错过了什么吗?元素在2秒后总是在那里,并且在10秒过去之前发生错误。我已经阅读了至少10个其他类似的帖子,但没有一个能够解决这个问题......除了Thread.Sleep(5000)

+0

如果你正在使用'WebDriverWait',你怎么能''没有这样的元素异常',而它抛出'TimeoutException''? –

+0

@SaurabhGaur'Until()'如果它们不在忽略列表中,则抛出异常 –

+0

您还在使用隐式等待吗?如果您同时使用隐式和显式等待,您可能会收到意想不到的结果。 – JeffC

回答

1

尝试在创建服务器后,将NoSuchElementException类型添加到服务器的IgnoreExceptionTypes中。

wait = new WebDriverWait(driver, new TimeSpan(0, 0, 0, 10)); 
wait.IgnoreExceptionTypes(typeof(NoSuchElementException)); 
wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("FieldId"))); 

一般来说,如果您指定的超时到期之前,服务员正在恢复,这是因为发生异常当前未被忽略。

WebDriverWait类是从DefaultWait类派生的。这两个你可以在github上查看,我发现它对理解如何使用它非常有帮助。

+0

你的回答基本上是正确的,除了异常类型应该是'NoSuchElementException' –

+0

@ kovpaev-alexey更新。谢谢! – digitalnoiz

+0

@digitalnoiz谢谢你。我会试着将其添加到我的忽略中,看看这是否有助于解决问题。当我这样做时,如果它有效,我就不会在这里。无论哪种方式感谢您的建议。 – Mase

相关问题