Selenium C#element NotVisibleException:元素不可交互,但元素实际可见
我正在使用Selenium.WebDriver for C#在Quora上提问,只需在记事本中键入我的问题 由于我不得不发布,所以一切都很顺利 要发布它,我需要单击跨距内的链接,如下所示: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> &
<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()
调试代码。如果您能够找到元素,请使用观察结果更新问题。