Selenium Catch Javascript处理错误

时间:2018-04-11 08:23:00

标签: c# wpf selenium

我想在网站上登录我的程序。如果用户名或密码错误,我想捕获错误消息(它是一个Javascript错误,如引导程序警报,它会在x秒后改变可见性)。

我从以下开始:

browser.FindElement(By.Name("user[login]")).SendKeys(Username);
IWebElement element = browser.FindElement(By.ClassName("flash-message"));
if(element.GetAttribute("style") != " ")
{
    Debug.WriteLine("Error Message: " + browser.FindElement(By.XPath("//p[@class='util-relative rsp-container']")).Text);
}

启动时错误框的HTML代码(没有任何错误):

<div class="flash-message notice" style="display:none">
    <p class="util-relative rsp-container">
        <a class="icon-close" href="" data-action="FlashHide"></a> 
    </p>
</div>

错误期间错误框的HTML代码:

<div class="flash-message alert" style="">
  <p class="util-relative rsp-container">
    Username wrong.
    <a class="icon-close" href="" data-action="FlashHide"></a>
  </p>
</div>

可见更改后错误框的HTML代码:

<div class="flash-message alert" style="display: none;">
  <p class="util-relative rsp-container">
    Username wrong.
    <a class="icon-close" href="" data-action="FlashHide"></a>
  </p>
</div>

我猜我可以用<p>来抓住browser.FindElement(By.XPath("//p[@class='util-relative rsp-container']")).Text的内部文本:{{1}}而不是内部文本,我什么也得不到。

3 个答案:

答案 0 :(得分:0)

您可以使用javascripts获取价值: -

WebElement element = browser.FindElement(By.XPath("//p[@class='util-relative rsp-container']"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 

答案 1 :(得分:0)

您可以使用JavascriptExecutor获取Webelement的所有属性,并在其中查看您的错误消息:

WebElement element = browser.FindElement(By.XPath("//p[@class='util-relative rsp-container']"));    
IJavascriptExecutor javascriptDriver = (IJavaScriptExecutor)driver;
Dictionary<string, object> attributes = javascriptDriver.ExecuteScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", element) as Dictionary<string, object>;

答案 2 :(得分:0)

根据您的问题提取错误消息用户名错误。,您必须使用 WebDriverWait ,如下所示:

IWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var myText = wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='flash-message alert']/p[@class='util-relative rsp-container']"))).Text;