ElementToBeClickable'无法正常工作'

时间:2017-11-16 06:31:30

标签: c# selenium selenium-webdriver

IWebDriver driver = new RemoteWebDriver(uri, dc);
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,60));
driver.Navigate().GoToUrl("https://google.com/ncr");
string xpath = "//*[@id=\"lst-ib\"]";  // the google search text box
IWebElement element = driver.FindElement(By.XPath(xpath));
//wait.Until(ExpectedConditions.ElementToBeClickable(element));
element.Click();
element.SendKeys("some text");

上面的代码按原样运行。但是,如果我取消注释wait.Until,则浏览器将打开,但不会发送任何文本。它似乎在等待时“停止”。直到。不知道我做错了什么。对于当前的用例来说这不是问题,但是知道如何正确地将其用于将来的用途会很好。

编辑: 经过一些搜索和测试后,我发现以下代码专门用于RemoteWebDriver。

IWebDriver driver = new RemoteWebDriver(uri, dc);
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);
IWebElement element = driver.FindElement(By.Name(name));

当DOM中存在“name”时它起作用,并且当我将“name”修改为不在DOM中的东西时抛出异常,如预期的那样。 感谢@DebanjanB让我朝着正确的方向前进。

2 个答案:

答案 0 :(得分:2)

如果您在 WebElement 上查看 Search Box 表示为 Google Home Page ,则该元素如下:

<input class="gsfi" id="lst-ib" maxlength="2048" name="q" autocomplete="off" title="Search" type="text" value="" aria-label="Search" aria-haspopup="false" role="combobox" aria-autocomplete="list" dir="ltr" spellcheck="false" style="border: none; padding: 0px; margin: 0px; height: auto; width: 100%; background: url(&quot;data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D&quot;) transparent; position: absolute; z-index: 6; left: 0px; outline: none;">

关于 Search Box 的几件事:

  1. 它是 <input> 标记,仅接受 text
  2. <input> 标记没有与 onClick()相关联的任何 <button> 事件 <a> 标记。
  3. 因此 ExpectedConditions 的正确条款可以是 ElementIsVisible ,而不是ElementToBeClickable
  4. ElementIsVisible 子句将确保an element is present on the DOM of a page and visible.
  5.   

    Visibility 表示该元素不仅会显示,而且其高度和宽度也会大于0.

    更新:

    正如您所说,您得到的结果相同,所以我会对您的代码进行一些简单的调整,并将相应的代码编写为:

    WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,10));
    IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.Name("q")));
    element.SendKeys("some text");
    

答案 1 :(得分:0)

你可以试试下面的代码吗?工作正常。

public static void search() throws Throwable
    {
        WebElement SearchBox = driver.findElement(By.xpath(".//*[@id='ctl00_PlaceHolderSearchArea_SmallSearchInputBox1_csr_sbox']"));
        SearchBox.clear();
        SearchBox.sendKeys("Text");
        driver.manage().timeouts().implicitlyWait(8000, TimeUnit.SECONDS);
        WebElement SearchLink=driver.findElement(By.xpath(".//*[@id='ctl00_PlaceHolderSearchArea_SmallSearchInputBox1_csr_SearchLink']"));
        SearchLink.click();
        driver.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);
        driver.navigate().back();   
    } 

如果您遇到任何挑战,请告诉我