C#和断点 – 我们这里有魔术师吗?

我有这个:

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()仍然无限进行!)。

现在,你会告诉我“嘿!那个中间代码不是什么东西!”但是哦,甜蜜的祝福……那个中间代码可以做两件事:要么向我扔东西,要么就像它应该做的那样( certificate1和certificate2 )。

最后,这是怎么回事? 关于断点。 一旦我把断点放在那个return (就在魔法代码之后!)代码正确执行! 程序化世界如何可能,断点修复我的应用程序!?

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

这就是你有时会看到Thread.Sleep(N); 在这里和那里抛出代码。 那是一个编码器,他/她的双臂抱起来说“我不知道。只是在那里睡觉。”

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

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

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

另一件事是将IWebElement结果保存到temp var中,放入小睡眠然后单击它。 有时浏览器ui无法像selenium一样快地处理命令。

 var el = Setup.Driver.FindElement(By.LinkText(text)); Thread.Sleep(750); el.Click(); 

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