c# - Selenium 等待逻辑

标签 c# selenium selenium-webdriver coded-ui-tests

我正在为我的网站构建一个测试框架 我想将框架与测试完全分开 问题是当我编写测试时,有时 Assert 需要时间才能为真,例如,如果我在上传文件页面上,并且当文件上传时,网站应该显示文件上传成功页面,但它需要很多时间直到浏览器到达这个页面

我应该如何强制 Assert 在返回结果之前等待一段时间?

一些代码可以解释我目前的工作方式:

上传页面类

Public class UploadPage
{
 [FindsBy(How = How.Name, Using = "upload-button")]
 public IWebElement BtnUpload { get; set; }

  public UploadPage()
  {
   PageFactory.InitElements(Driver, this);
  }

 public void UploadFile(string path)
  {
    //select file
    BtnUpload.Click();
  }
}

成功上传页面:

 Public class UploadSuccessfulPage
   {
     [FindsBy(How = How.Name, Using = "success-message")]
     public IWebElement LblSuccessMessage{ get; set; }

     public UploadSuccessfulPage()
     {
       PageFactory.InitElements(Driver, this);
     }
     public bool IsAt()
     {
      Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(60))
      return Driver.url==configurations.UploadSuccessfulPageURL;
     }
   } 

测试方法:

public void TestUpload()
{
 UploadPage uploadPage= new UploadPage ();
 uploadPage.UploadFile(path);
 UploadSuccessfulPage successPage= new UploadSuccessfulPage();
 Assert.IsTrue(successPage.IsAt());
}

当我以这种方式编写测试时,断言不会等待,尽管 IsAt() 包含隐式等待

P.S: 我不打算使用 Thread.Sleep();

最佳答案

bool IsAt() 方法应该像这样实现:

public bool IsAt()
{
  Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(60));
  try {
     return driver.FindElement(By.Name("success-message").Displayed;
  } catch (WebDriverException e) {
    return false;
  }
}

或者使用显式等待:

public bool IsAt()
{
  try {
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
     wait.Until(ExpectedConditions.ElementIsVisible(By.Name("success-message")));
    return true;
  } catch (TimeoutException e){
    return false;
  }
}

更新: 如果你想通过 url 验证,bool IsAt() 应该是这样的:

public bool IsAt()
    {
      try {
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
         wait.Until(ExpectedConditions.UrlToBe(configurations.UploadSuccessfulPageURL));
        return true;
      } catch (TimeoutException e){
        return false;
      }
    }

看类ExpectedConditions找到适合您要求的条件

关于c# - Selenium 等待逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41264321/

相关文章:

c# - 如何使用变量名称以 _ 或 $ 开头的对象列表反序列化 JSON 响应

c# - 在没有 SQL Server 的情况下创建 C# 应用程序

c# - WCF 客户端 : First call fails, 第二次调用成功

css - 用 htmlunit 驱动替换 firefox 驱动

c# - 使用 C# 反序列化来自 Web Api 的 BadRequest 响应的问题

python - 防止 robotsframework-selenium2 中的屏幕截图

java - 在自动化的第二个选项卡中启动 'data;' 标题选项卡,并在第一个选项卡中点击 url

selenium - 在 Selenium WebDriver 的属性中使用 XPath 通配符

javascript - 如何将鼠标悬停在超链接上 - Webdriver

java - 如何使用带有 selenium webdriver 的 Windows 文件资源管理器选择多个文件