函数使索引超出范围异常

时间:2016-08-24 15:53:15

标签: c# selenium xunit

我有一个函数,它将根据传递的索引从列表中获取IWebElement。

这是属性 -

public IList<IWebElement> ExistingDrafts { get { return Driver.FindElements(By.ClassName("broadcast-list-item")); } }

这是函数 -

public void DeleteDraft(int index = 0) {

     if(ExistingDrafts.Count > 0) {
        ExistingDrafts[index].Click();
     }

     IWebElement discardButton = Driver.FindElement(By.XPath("/html/body/div[2]/div/div[1]/div[2]/div/div[2]/form/div[7]")).FindElements(By.ClassName("form-control"))[0];
     Wait.Until(w => discardButton != null);

     discardButton.Click();
  }

以下是我在测试中的使用方法 -

[Fact]
  public void DeleteTheDraft() {

     BroadcastPage.DraftsHyperLink.Click();
     //delete first draft
     string firstDraftSubj = BroadcastPage.ExistingDrafts[0].Text;
     System.Threading.Thread.Sleep(6000);
     BroadcastPage.DeleteDraft(0);

     string newfirstDraftSubj = BroadcastPage.GetNewestDraftSubject();
     BroadcastPage.Wait.Until(w => newfirstDraftSubj != null);

     Assert.True(firstDraftSubj != newfirstDraftSubj, "Draft was not deleted");
  }

当我通过我的测试进行调试时,它会通过。但是,如果我运行测试,它会抛出异常。我不确定发生了什么。

1 个答案:

答案 0 :(得分:1)

这是因为并非所有元素都加载到页面上。 基本上public IList<IWebElement> ExistingDrafts { get { return Driver.FindElements(By.ClassName("broadcast-list-item")); } }只会获得一些元素(看到你检查Count > 0)。

你最好的方法就是等待所有元素出现等待,这可以通过以下方式实现:

public By ExistingDraftBy
{
    get {return By.ClassName("broadcast-list-item");}
}

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 2, 0));
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(ExistingDraftBy));

为了安全起见,修改你的if语句以检查索引是否小于计数:

if(ExistingDrafts.Count > 0 && index < ExistingDrafts.Count) 
{
    ExistingDrafts[index].Click();
}