【问题标题】:Can I use System.Timers as an alternative to Thread.Sleep() when testing with C# and Selenium in Visual Studio 2019?在 Visual Studio 2019 中使用 C# 和 Selenium 进行测试时,我可以使用 System.Timers 作为 Thread.Sleep() 的替代品吗?
【发布时间】:2021-09-18 20:18:35
【问题描述】:

我正在尝试在我的测试中替换所有(或至少大部分) Thread.Sleep(),似乎 System.Timers 可以完成这项工作,但我不知道如何实现它。

或者如果你们知道其他替代品,请告诉我。

如果有人在这里帮助我,我将不胜感激。

谢谢。

编辑:对不起,这是我的第一个问题,我应该举个例子:

public void AdditionalCardIssueNoBankBranchSelected()
    {
        
        additionalCardApplicationPage.ClearBankConsultantCodeField();
        additionalCardApplicationPage.TypeSalesOfficer();
        additionalCardApplicationPage.TypeEIKBankCustomerAndPressGetDataButton();
        additionalCardApplicationPage.ChooseMainCard();
        chooseMainCardPage.TypeCustomerEikAndPressSearchButton();
        Thread.Sleep(1000);
        bankCardSearchPage.SelectFirstValidBankCardOther();
        chooseMainCardPage.PressChooseMainCardButton();
        additionalCardApplicationPage.PressStartApplicationButton();
        Thread.Sleep(1000);
        IAlert alert = driver.SwitchTo().Alert();
        alert.Accept();
        Assert.IsTrue(additionalCardApplicationPage.BankBranchCodeAlert.Displayed);
    }

几乎所有我有Thread.Sleep() 的地方都是因为我正在等待页面完全加载,因为如果它没有,下一步操作将不会发生,因为我想要与之交互的元素还不可见。 有时 bankCardSearchPage.SelectFirstValidBankCardOther() 不会通过,因为卡片所在的表格尚不可见。

我希望我解释得很好。谢谢。

【问题讨论】:

  • 你能至少举一个你想要Thread.Sleep()替换的代码示例吗?
  • 所以你基本上想推出自己的Thread.Sleep()
  • 是的,基本上我想推出自己的 Thread.Sleep()
  • 希望用计时器替换Thread.Sleep(1000); 背后的动机是什么?是否要防止当前线程被阻塞,从而使您的应用程序响应更快?
  • Theodor Zoulias,看来计时器不是我在这里需要的,而是另一种明确的等待,就像一个 Cruisepandey 很好地帮助了我。我只知道 Thread.Sleep 不好,应该更换,正在网上寻找解决方案,并认为计时器可以完成工作,但现在我知道了。无论如何,感谢您提供帮助:)

标签: c# visual-studio selenium selenium-webdriver


【解决方案1】:
Thread.sleep()

是一个明确的等待,但最糟糕的是。

最好的在下面(显式等待):

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[text()='OK']/..")));

您几乎可以用上面提到的动态等待替换所有内容。

它会做的是在 DOM 中为每个 500ms until 20 seconds 寻找 web 元素(就像我们 have defined 20 in the above object creation),如果找到它会返回 web element,如果不是 Timeout exception will be raised.

【讨论】:

  • 感谢您的帮助!它似乎正在工作!所以我所做的是添加“var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));”作为我测试的第一行,但由于我有很多测试 - 我应该把它放在哪里以便它适用于所有测试?我试图把它放在我声明我正在使用的页面的 TextFixture 中,但是“var”在那里不好 - 它应该以不同的方式声明?也是“驱动程序” - 不能引用非静态字段、方法或属性?
  • 你有TestBase类吗?如果是,则在 TestBase 中创建一个全局变量,该变量应在所有测试类或实用程序类中可见。您可以在 TestBase 构造函数中创建WebDriverWait 的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多