3

我有这个:

public static void ByLinkText(string text)
{
    for (var i = 0; i < 50; i++)
    {
        try
        {
            Setup.Driver.FindElement(By.LinkText(text)).Click();
            return;
        }
        catch (Exception)
        {
        }
    }
}

(中间的奇怪代码是 selenium - 让我们跳过它,这里不是这种情况)

好的,所以我有这个ByLinkText()方法,你在这里看不到的是,我无限重复这个方法,直到这个中间的东西正确执行,然后再点击它return

所以:这个中间代码没有正确执行,我想知道为什么,那我在做什么?我在 catch 部分放了一个断点。怎么了?什么都没有(并且ByLinkText()仍然无限地继续下去!)。

现在,你会告诉我“嘿!中间代码没有扔任何东西!”,但是哦,甜蜜的祝福......中间代码可以做两件事:要么向我扔东西,要么按照它应该的方式做(provid1证明2 )。

所以最后,这到底是怎么回事?关于断点。只要我在上面设置断点return(就在神奇代码之后!),代码就会正确执行!在程序世界中,断点如何修复我的应用程序!?

4

4 回答 4

2

当断点使您的应用程序运行时,这意味着您的代码可能存在时间问题。每当您在断点处停止时,停止都会引入延迟,这可能会让其他处理继续进行而不会出错。

这就是为什么你有时会看到Thread.Sleep(N);到处乱扔代码。那是一个程序员举起他/她的手臂说“我不知道。只要在里面放一个睡眠。”

事实上,试一试。放一个 Thread.Sleep(3000); 断点在哪里,看看会发生什么。我从不建议这是解决方案,但它可能是对理论的一个很好的测试。

于 2013-03-16T23:21:09.470 回答
2

我认为这与硒的关系比你想象的要多。看看隐式和显式等待查找元素。

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

要尝试的另一件事是将 IWebElement 结果保存到临时变量中,进入小睡眠状态,然后单击它。有时浏览器 ui 无法像 selenium 发出命令那样快速处理命令。

var el = Setup.Driver.FindElement(By.LinkText(text));
Thread.Sleep(750);
el.Click();
于 2013-03-17T00:42:38.843 回答
0

你在这里重新发明轮子。Selenium 可以为您执行此方法:

http://selenium.googlecode.com/git/docs/api/dotnet/html/AllMembers_T_OpenQA_Selenium_Support_UI_WebDriverWait.htm

于 2013-03-18T13:21:35.507 回答
0

尝试添加对 System.Diagnostics.Debugger.Break() 的调用。或者将 exception.ToString() 结果写入控制台。

于 2013-03-17T00:47:01.267 回答