Selenium C#:如何再次查找元素
本文关键字:查找 元素 何再次 Selenium | 更新日期: 2023-09-27 18:31:53
第一次来这里。所以我在硒测试方面需要一些帮助,这让我现在被困了几个小时。
所以我在页面上存储了一个IList<IWebElement>
,由<a>
组成。我能够通过foreach单击该IList的第一个元素,从新页面获取我需要的内容,然后使用driver.manage.navigate.back().
返回列表页面
但是,这一次,我无法单击列表的第二个元素。
有没有办法找到第二元素、第三元素、第四元素等?
static void Main(string[] args)
{
IWebDriver driver = new FirefoxDriver();
string url = "http://DummyPageOne.Com";
driver.Navigate().GoToUrl(url);
driver.Manage().Timeouts().ImplicitlyWait(Timespan.FromSeconds(10));
PageOne page = new PageOne();
foreach (IWebElement item in page.Items)
{
item.Click();
ItemDetails details = new ItemDetails();
details.SaveImage(@"D:'Images'");
driver.Navigate().Back();
}
}
public class PageOne()
{
public PageOne()
{
PageFactory.InitElements(driver, this);
}
public IList<IWebElement> Items;
public void StoreItems()
{
string locator = "DummyLocator";
Items = driver.FindElements(By.Xpath(locator));
}
}
public class ItemDetails()
{
public ItemDetails()
{
PageFactory.InitElements(driver, this);
}
public void SaveImage()
{
}
}
根据我从你的问题中了解到的,这是实现这一目标的方法。我在 Chrome 上检查了以下 C# 代码,它运行良好。我希望这有所帮助。
[Test]
public void ClickAllLinks()
{
//Navigate to URL
driver.Navigate().GoToUrl(@"https://www.google.co.in/#q=Selenium");
//Store Links in IList
IList<IWebElement> resultLinks = driver.FindElements(By.CssSelector("div#ires>ol>div:not(:first-child)>div>div>h3>a"));
//Print Count
//Console.WriteLine(googleLinks.Count);
for (int i = 0; i < resultLinks.Count; i++)
{
int j = i + 1;
//Click on Link
driver.FindElement(By.CssSelector("div#ires>ol>div:not(:first-child)>div:nth-child(" + j + ")>div>h3>a")).Click();
//Print Element Locator
//Console.WriteLine("div#ires>ol>div:not(:first-child)>div:nth-child(" + j + ")>div>h3>a");
Thread.Sleep(2000); //Static wait is not recommended, add conditional wait
//Get what you need from new page
//Navigate back parent page
driver.Navigate().Back();
Thread.Sleep(2000); //Static wait is not recommended, add conditional waits
}
}
如果这不是您想要的,请告诉我。
简单的方法是在循环结束时再次初始化该列表。
好的,关于 .Net 和 Selenium 要记住的事情是,C# 变量/类型是对浏览器内存(屏幕上)中存在的内容的引用。
当浏览器窗口导航离开时,这些变量持有的引用将无效。你必须"重新找到"它们。
如果您也可以单击列表中的第一项,我会感到非常惊讶。
单击这些对象的唯一方法是在重新加载页面后重新获取对象。例如:Driver.FindElement(By.XPath("''div[@class='somelocator']"));
如果可以的话,我建议构造一个"By"类的集合。然后在 Find 方法中使用它们循环遍历 By 类。
这样,循环的每次迭代,您都将获得新鲜的对象。