我试图自动测试网站上的所有链接。 但问题是我的foreach循环在第一次点击后停止。
当我在Console.log中时,它会写出所有链接的属性,但是当它点击时间时不会这样做:)
这会记录所有链接。
[FindsBy(How = How.TagName, Using = "a")]
public IWebElement hrefClick { get; set; }
public void TestT2Links()
{
foreach (IWebElement item in PropertiesCollection.driver.FindElements(By.TagName("a")))
{
Console.WriteLine(item.GetAttribute("href"));
}
}
但是当我尝试使用Click()函数时,它只会点击第一个链接。
[FindsBy(How = How.TagName, Using = "a")]
public IWebElement hrefClick { get; set; }
public void TestT2Links()
{
foreach (IWebElement item in PropertiesCollection.driver.FindElements(By.TagName("a")))
{
hrefClick.Click();
Console.WriteLine(item.GetAttribute("href"));
}
}
我还尝试使用back方法在每次点击后返回导航,但也无用和错误:(
PropertiesCollection.driver.Navigate().Back();
任何提示? 提前致谢
答案 0 :(得分:4)
您需要找到所有链接。您使用的[FindsBy]
会返回 a 链接而非列表。首先找一个集合
[FindsBy(How = How.TagName, Using = "a")]
public IList<IWebElement> LinkElements { get; set; }
修改强>
只需点击,只需点击WebElements
列表,就可能会因StaleElement
刷新而返回DOM
引用异常。使用for loop
并找到元素运行时。
[FindsBy(How = How.TagName, Using = "a")]
public static IList<IWebElement> LinkElements { get; set; }
private void LoopLink()
{
int count = LinkElements.Count;
for (int i = 0; i < count; i++)
{
Driver.FindElements(By.TagName("a"))[i].Click();
//some ways to come back to the previous page
}
}
答案 1 :(得分:1)
另一种无需点击的解决方案
public void LoopLink() {
int count = LinkElements.Count;
for (int i = 0; i < count; i++)
{
var link = LinkElements[i];
var href = link.GetAttribute("href");
//ignore the anchor links without href attribute
if (string.IsNullOrEmpty(href))
continue;
using (var webclient = new HttpClient())
{
var response = webclient.GetAsync(href).Result;
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
}
}
}
答案 2 :(得分:0)
替换
hrefClick.Click();
带
item.Click()
在你的foreach()循环中