Selenium C#ElementNotVisibleException:元素不可交互,但该元素实际上是可见的

时间:2018-12-02 16:04:33

标签: c# selenium xpath css-selectors webdriverwait

我正在使用Selenium.WebDriver for C#在Quora上提问,只需在记事本中键入我的问题即可。

一切正常,因为我不得不发布它。

要发布它,我需要单击跨度内的链接,如下所示:

<span id="__w2_wEA6apRq1_submit_question">
  <a class="submit_button modal_action" href="#" id="__w2_wEA6apRq1_submit">Add Question</a>
</span>

为了单击它,我尝试了这种方法,这是我之前所有按钮单击所使用的方法:

选择元素并单击它:

var element = driver.FindElement(By.CssSelector(".submit_button.modal_action"));
element.Click();

这样做可以获取元素,但不幸的是,它引发了“ ElementNotVisibleException”。调试我的应用程序时,我可以看到Displayed属性设置为False,而实际上没有,因为在ChromeDriver中我可以清楚地看到按钮。

为避免单击该元素,我尝试IJavaScriptExecutorDriver.ExecuteJavaScript();通过脚本单击链接:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].click()", element);

Driver.ExecuteJavaScript();使用了相同的逻辑,但是得到的结果相同,但是当我在DevTools的“控制台”选项卡中写入相同的脚本时,效果很好。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

在执行检查后,可能会出现按钮显示(可见)的情况,因此,您可以尝试以下延迟,以确保在检查时显示按钮:

public static void WaitForElementToBecomeVisibleWithinTimeout(IWebDriver driver, 
    IWebElement element, int timeout)
{
    new WebDriverWait(driver,                 
        TimeSpan.FromSeconds(timeout)).Until(ElementIsVisible(element));
}

private static Func<IWebDriver, bool> ElementIsVisible(IWebElement element)
{
    return driver =>
    {
        try
        {
            return element.Displayed;
        }
        catch (Exception)
        {
            // If element is null, stale or if it cannot be located
            return false;
        }
    };
}

如果该按钮在视口中不可见(即需要滚动以使其可见),则可以使用

public static void ScrollElementToBecomeVisible(IWebDriver driver, IWebElement element)
{
    IJavaScriptExecutor jsExec = (IJavaScriptExecutor)driver;
    jsExec.ExecuteScript("arguments[0].scrollIntoView(true);", element);
}

答案 1 :(得分:1)

根据您共享的HTML,单击元素为添加问题的元素,因为该元素位于模态对话框中,您需要引入 WebDriverWait 作为所需的 ElementToBeClickable ,您可以使用以下Locator Strategies作为解决方案:

  • LinkText

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.LinkText("Add Question"))).Click();
    
  • CssSelector

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("span[id$='_submit_question']>a.submit_button.modal_action"))).Click();
    
  • XPath

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[contains(@id,'_submit_question')]/a[@class='submit_button modal_action' and contains(.,'Add Question')]"))).Click();