隐式等待命令不工作-selenium webdriver C#

时间:2017-10-16 09:47:20

标签: c# selenium webdriver wait implicit

伙计们,我已经开始研究selenium web驱动程序了。你可以假设我是初学者。目前,我在代码(C#)中实现隐式等待命令时遇到了困难。由于未找到Element,因此它不能正常工作并导致异常,但是当我添加" Thread.Sleep(3000)时,代码可以完美地执行。我一直在寻找互联网上的解决方案,但无法解决问题。下面我提到了示例代码。

class Entrypoint
{

static void Main()

{
 IWebDriver driver = new ChromeDriver();
    **driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);**
    driver.Navigate().GoToUrl("https://r1.netrevelation.com:8443/mcba-cms/pages/flight-transfer.cab");
    driver.Manage().Window.Maximize();


    driver.FindElement(By.Id("loginlink")).Click();
    driver.FindElement(By.Id("headerSubView:inputUserName:input")).SendKeys("st001");
    driver.FindElement(By.Id("headerSubView:inputPassword:input")).SendKeys("hello321" + Keys.Enter);

    driver.FindElement(By.Id("dateOfFlight:input")).Click();**//This Step does not get Executed , it throws exception element not found.**
    driver.FindElement(By.Id("ui-datepicker-div")).Click(); 
    driver.FindElement(By.XPath(".//*[@id='ui-datepicker-div']/div/a[2]/span")).Click(); 
    driver.FindElement(By.LinkText("28")).Click(); 
    IWebElement Flightno = driver.FindElement(By.Id("selectedFlight:input"));
    Flightno.SendKeys("BA901" + Keys.Enter);
    IWebElement Flighttick = driver.FindElement(By.Id("flightTickImg"));


    driver.Quit();

请注意,目前我不想使用显式等待,因为隐含将满足我的需要(如果它开始工作)。上面的代码以超音速运行以某种方式它设法登录到系统但后来它失败每次原因是一旦登录请求系统暂停2-3秒。请在这方面提供您的意见。

1 个答案:

答案 0 :(得分:1)

根据documentation Implicit Wait 是告诉WebDriver在尝试find an element或{{find all elements或{{}时轮询DOM一段时间1}}如果它们不能立即获得。但availability中某个元素的 HTML DOM 并不能保证您在代码块中尝试的 Element is Clickable 。因此,您将 exception 视为 Element not found

解决方案:

因此,您的问题的解决方案是将 Explicit Wait ExpectedConditions 条款一起强制为 ElementToBeClickable 这不仅会确认availability中元素的 HTML DOM ,还会确保 Element is Clickable Element is Displayed and Enabled 如下:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("loginlink")));