元素无法找到Selenium

时间:2017-06-27 09:25:41

标签: c# selenium winappdriver

我使用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();

}

1 个答案:

答案 0 :(得分:0)

您目前使用它的方式只需将catch (Exception)替换为catch (NoSuchElementException),这是在找不到元素时引发的Selenium特定异常。但是我通常建议不要将整个测试包装在try catch中,只是为了找不到元素。

需要注意的一件事(你可能错过了)是NoSuchElementException在找不到元素时会被FindElement抛出,并告诉你它找不到元素的选择器。所以在你的情况下,如果

excelSession.FindElementByName("Blank workbook").Click();

无法找到名称为Blank workbook的元素,它会在异常详细信息中将NoSuchElementException与选择器一起抛出。

还有一点需要注意:当您为驱动程序设置隐式等待持续时间时,它会保留驱动程序对象的生命周期 - 您可以在测试开始时设置一次,而不是再次触摸它。如果您需要在整个测试期间等待不同的时间段,可以通过WebDriverWait类使用显式等待。