我有一个函数,它将根据传递的索引从列表中获取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");
}
当我通过我的测试进行调试时,它会通过。但是,如果我运行测试,它会抛出异常。我不确定发生了什么。
答案 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();
}