当前位置: 首页 > 知识库问答 >
问题:

Selenium等待逻辑

黄昊
2023-03-14

我正在为我的网站建立一个测试框架,我想完全将框架从测试中分离出来,问题是当我写一个测试时,有时断言需要时间,直到它可以是真的,例如,如果我在上传文件页面,当文件上传时,网站应该显示文件上传成功页面,但它需要很长时间,直到浏览器到达这个页面

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

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

上传页面类

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()包含隐式等待,但断言不会等待

页(page的缩写)我不打算用线。睡眠();

共有1个答案

夹谷星剑
2023-03-14

方法布尔 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进行验证,则<code>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类,找到适合您需求的条件

 类似资料:
  • 我对Selenium和Python是新手。我可以浏览网站,找到元素并打印出来,但速度很慢 Python版本:3.10;Selenium WebDrive:Firefox;IDE:PyCharm 2021.3.2(CE);操作系统:Fedora 35 VM 我试图打印的元素的HTML代码: 我的Python Selenium找到了大部分时间都能正常工作的代码(但当服务器需要很长时间才能响应时失败):

  • 我正在尝试自动化基于共享点的应用程序,它有时会很慢。在下面的示例中,我试图将密码输入包装成显式等待。目前,Selenium以快速运行测试,导致无法执行操作。 如何将密码部分包装成硒显式方式?

  • 问题内容: 是的,我知道这个问题经常被问到,但是我还是不明白。我想让Selenium等待,无论如何。我尝试了这些方法 和其他东西,但它不起作用。我需要selenium才能等待10秒。 NO 直到一些元素被加载或什么,只是等待10秒。我知道有这个 我不要那个 。 如果要花几秒钟(无法实现)等待selenium,那么其他(python)库/程序将能够完成此任务?使用Java Selenium似乎没有问

  • 我有一个打开浏览器的ruby脚本。我把它设置为先打开Firefox,然后再打开Chrome,如果FF因为某种原因失败了,比如FF得到了更新,Selenium还没有赶上。 等待函数/定义对FF很好,但总是中断。以下是Chrome浏览器启动的相关代码: 我对Selenium还是相当陌生,我使用了等待。在声明如下内容后,直到命令: 以上代码行在Firefox中运行良好。但是,我想用FF和Chrome运行

  • 问题内容: 我正在浏览一个Web应用程序,如果尝试单击某个元素之后才能与之交互,则该Web应用程序通常会引发错误。 使用Selenium WebDriver(java)时,我可以轻松解决此问题: 但是,我试图使用Selenium类型库在VBA中编写脚本,尽管尝试了许多不同的方法,但我唯一的成功是: 有人告诉我,应该尽可能避免这样做。如果有人可以建议如何将Java转换为VBA或提供任何其他解决方案,

  • 问题内容: 我们正在将Selenium与Java API和一些Javascript用户扩展一起使用。我们在应用程序中使用了很多AJAX调用。我们的许多测试都是随机失败的,因为有时AJAX调用的完成速度比其他时间慢,因此页面未完全加载。我们通过等待特定元素或Thread.sleep来解决此问题。我试图找到一种方法来代替等待网络流量完成。这样我们就可以做到这一点: 这样,我们可以摆脱线程hiberna