我正在使用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中我可以清楚地看到按钮。
为避免单击该元素,我尝试IJavaScriptExecutor
和Driver.ExecuteJavaScript();
通过脚本单击链接:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].click()", element);
Driver.ExecuteJavaScript();
使用了相同的逻辑,但是得到的结果相同,但是当我在DevTools的“控制台”选项卡中写入相同的脚本时,效果很好。
我该如何解决这个问题?
答案 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();