为什么我不能再使用相同的参数调用此方法? (null参考)

时间:2016-08-12 13:16:22

标签: c# selenium-webdriver

我想我在这里真的错过了什么,但无法弄清楚是什么。我希望这个方法返回一个web元素,但如果有这个特定的错误,我希望它再试一次:

int findCounter = 0;
public IWebElement Find([Optional] string[] Element, [Optional] string Text)
{
   IWebElement element;

   element = null;

   if (findCounter < 30){


    if (Text != null)
    {
        Wait(null, Text);
        element = driver.FindElement(By.LinkText(Text));
        findCounter = 0;
        return element;
    }


    else
    {
        try
        {
            if (Element[1] == "xpath")
            {
                Wait(Element, null);
                element = driver.FindElement(By.XPath(Element[0]));
                findCounter = 0;

            }
            else if (Element[1] == "id")
            {
                Wait(Element, null);
                element = driver.FindElement(By.Id(Element[0]));
                findCounter = 0;

            }
            else if (Element[1] == "linktext")
            {
                Wait(Element, null);
                element = driver.FindElement(By.LinkText(Element[0]));
                findCounter = 0;                   
            }
        }
        catch (StaleElementReferenceException e)
        {
            Console.Out.WriteLine("Attempting to recover from StaleElementReferenceException ...");
            Sleep(250);
            findCounter++;
            Find(Element, Text);
        }
        return element;
    }
    }   return null;
}

所以我试试看:

Find(Element, null)

它会出错,输出消息,然后失败:

尝试从StaleElementReferenceException中恢复...

NullReferenceException'对象引用未设置为对象的实例。'

但我第一次使用相同的参数。可能有什么不对?

2 个答案:

答案 0 :(得分:2)

在你的捕获中你还想要元素吗?

如果是,那么您将要返回return Find(Element, Text);

答案 1 :(得分:0)

也许你必须检查变量的值&#34; [可选] string []元素&#34;你传递给函数。因为在错误输出中,声明try块中的变量为null且无法处理,因为在catch块中错误类型是&#34; StaleElementReferenceException&#34;。

我的建议是再应用一个处理Null错误的catch块并在那里放置一个断点。检查哪些值为空,哪些值不为,那么您将意识到缺少的值。

示例代码:

    try
    {
        if (Element[1] == "xpath")
        {
            Wait(Element, null);
            element = driver.FindElement(By.XPath(Element[0]));
            findCounter = 0;

        }
        else if (Element[1] == "id")
        {
            Wait(Element, null);
            element = driver.FindElement(By.Id(Element[0]));
            findCounter = 0;

        }
        else if (Element[1] == "linktext")
        {
            Wait(Element, null);
            element = driver.FindElement(By.LinkText(Element[0]));
            findCounter = 0;                   
        }
    }
    catch (StaleElementReferenceException e)
    {
        Console.Out.WriteLine("Attempting to recover from StaleElementReferenceException ...");
        Sleep(250);
        findCounter++;
        Find(Element, Text);
    }
    catch (NullReferenceException e)
    {
        //break point here.
    }