我使用selenium来运行我创建的测试。我现在想要开始错误处理。我希望能够在错误日志中找到无法找到的元素并说出"Element start could not be found"
之类的内容。如果不能这样做,我想打印发生异常的整行代码。
我不知道该怎么做。目前我只是将每个测试包装在一个try catch中并说Couldn't find element
然而这是非常广泛的,并且不会缩小它无法找到的元素。
我的会话setUp
private string excelId = CommonMethods.ExcelOfficeVersion();
private const string AppDriverUrl = "http://127.0.0.1:4723";
private static WindowsDriver<WindowsElement> excelSession;
System.Web.Caching.Cache cache = new System.Web.Caching.Cache();
xl.Workbook WB;
public static bool skipTearDown = false;
WindowsElement create;
WindowsElement blankWorkBook;
public static DesiredCapabilities appCapabilities = new DesiredCapabilities();
[TestInitialize]
public void SetUp()
{
try
{
appCapabilities.SetCapability("app", excelId);
var initialSession = new WindowsDriver<WindowsElement>(new Uri(AppDriverUrl), appCapabilities);
var capabilities = new DesiredCapabilities();
capabilities.SetCapability("app", "Root");
excelSession = new WindowsDriver<WindowsElement>(new Uri(AppDriverUrl), capabilities);
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
CommonMethods.keyCheck(excelSession);
//blankWorkBook = excelSession.FindElementByName("Blank workbook");
//cache.Insert("Create", create);
CommonMethods.checkCreateExcel();
}
catch (Exception)
{
CommonMethods.ExceptionHandler("WinApp Driver failed to load Excel", new StackTrace(true).GetFrame(0).GetFileLineNumber(), new StackTrace(true).GetFrame(0).GetMethod(), excelSession);
}
}
以下是我的代码
的示例try
{
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
excelSession.FindElementByName("Blank workbook").Click();
excelSession.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
excelSession.FindElementByName("Create").Click();
skipTearDown = true;
}
catch (Exception)
{
CommonMethods.ExceptionHandler("Couldn't find element", new StackTrace(true).GetFrame(0).GetFileLineNumber(), new StackTrace(true).GetFrame(0).GetMethod(), excelSession);
}
另一个典型的测试
public void newExcelWorkbook()
{
try
{
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
excelSession.FindElementByName("Blank workbook").Click();
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
excelSession.FindElementByName("Create").Click();
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
excelSession.FindElementByName("New").Click();
CommonMethods.IsElementDisplayed(excelSession, new StackTrace(true).GetFrame(0).GetFileLineNumber(), new StackTrace(true).GetFrame(0).GetMethod(), "CreateErrorIcon", "Error appeard while selecting the New button");
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
excelSession.FindElementByName("E Sample Data").Click();
CommonMethods.IsElementDisplayed(excelSession, new StackTrace(true).GetFrame(0).GetFileLineNumber(), new StackTrace(true).GetFrame(0).GetMethod(), "CreateErrorIcon", "Error appeard while selecting the E Sample Data button");
Thread.Sleep(4000);
excelSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
}
catch (Exception)
{
CommonMethods.ExceptionHandler("Couldn't find element", new StackTrace(true).GetFrame(0).GetFileLineNumber(), new StackTrace(true).GetFrame(0).GetMethod(), excelSession);
}
TearDown();
}
答案 0 :(得分:0)
您目前使用它的方式只需将catch (Exception)
替换为catch (NoSuchElementException)
,这是在找不到元素时引发的Selenium特定异常。但是我通常建议不要将整个测试包装在try catch中,只是为了找不到元素。
需要注意的一件事(你可能错过了)是NoSuchElementException
在找不到元素时会被FindElement
抛出,并告诉你它找不到元素的选择器。所以在你的情况下,如果
excelSession.FindElementByName("Blank workbook").Click();
无法找到名称为Blank workbook
的元素,它会在异常详细信息中将NoSuchElementException
与选择器一起抛出。
还有一点需要注意:当您为驱动程序设置隐式等待持续时间时,它会保留驱动程序对象的生命周期 - 您可以在测试开始时设置一次,而不是再次触摸它。如果您需要在整个测试期间等待不同的时间段,可以通过WebDriverWait
类使用显式等待。