我有这个:
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
之后。 / p>
所以:这个中间代码没有正确执行,我想知道为什么,所以我在做什么?我在catch部分放了一个断点。怎么了?什么都没有(ByLinkText()
仍然继续无限!)。
现在,你会告诉我“嘿!那个中间代码不是扔东西!”但是哦,甜蜜的祝福......那个中间代码可以做两件事:要么向我扔东西,要么像它应该做的那样(prove1和prove2)。
最后,这是怎么回事?关于断点。一旦我将断点放在return
(在魔法代码之后!)代码执行正确!在程序化世界中如何可能,断点修复我的应用程序!?
答案 0 :(得分:2)
当断点使您的应用程序运行时,这意味着您的代码可能存在计时问题。每当您在断点处停止时,停止会引入延迟,可能会让其他处理继续进行而不会出现错误。
这就是为什么有时会在这里和那里看到Thread.Sleep(N);
抛出代码的原因。那是一个编码员甩开他的手臂说“我不知道。只是在那里睡觉。”
事实上,试一试。放一个Thread.Sleep(3000);断点发生的地方,看看会发生什么。我不建议这是解决方案,但它可能是对理论的一个很好的测试。
答案 1 :(得分:2)
我认为这与硒的关系比你想象的要多。看看隐式和显式等待查找元素。
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();
答案 2 :(得分:0)
尝试添加对System.Diagnostics.Debugger.Break()的调用。或者将exception.ToString()结果写入控制台。
答案 3 :(得分:0)
你在这里重新发明轮子。 Selenium可以为你做这个方法: