Selenium C#element NotVisibleException:元素不可交互,但元素实际可见

Selenium C#element NotVisibleException:元素不可交互,但元素实际可见,c#,selenium,xpath,css-selectors,webdriverwait,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> &

我正在使用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>
这样我可以得到元素,但不幸的是它抛出了“ElementNotVisibleException”。调试我的应用程序时,我可以看到
displated
属性被设置为
False
,而它没有设置,因为在ChromeDriver中,我可以清楚地看到按钮

为了避免单击元素,我尝试了
IJavaScriptExecutor
Driver.ExecuteJavaScript()单击脚本中的链接:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].click()", element);
相同的逻辑用于
Driver.ExecuteJavaScript()但是我得到了相同的结果,但是当我将相同的脚本写入DevTools的控制台选项卡时,它工作得非常好


如何解决此问题?

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

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 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;
        }
    };
}

根据您共享的HTML,单击文本为“添加问题”的元素,因为该元素位于模式对话框中,您需要引导WebDriverWait使所需元素可选择,并且您可以使用以下任一方法作为解决方案:

  • LinkText

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

    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();
    

根据您共享的HTML,单击文本为的元素添加问题由于元素位于模式对话框中,您需要引导WebDriverWait使所需元素可选择,并且您可以使用以下任一解决方案:

  • LinkText

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

    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();
    

感谢您的回答,我尝试了使用您提供的方法,但我得到的响应超时,尝试时间为10秒。。还有其他提示吗?谢谢你的回答,我尝试了使用你提供的方法,但我得到的响应超时,尝试了10秒。。还有其他提示吗?谢谢你的支持,但不幸的是,这不起作用,我尝试了所有三种方法,它们抛出超时异常..TimeoutException是失败的ExpectedConditions的结果。通过与
Thread.sleep()连接的
findElement()
调试代码。如果您能够找到元素,请使用观察结果更新问题。感谢您的支持,但不幸的是,这不起作用,我尝试了所有三种方法,它们都抛出超时异常。TimeoutException是ExpectedConditions失败的结果。通过与
Thread.sleep()连接的
findElement()
调试代码。如果您能够找到元素,请使用观察结果更新问题。