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()
    {
    }
}

Selenium C#:如何再次查找元素

根据我从你的问题中了解到,这是实现这一目标的方法。我在 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 类。

这样,循环的每次迭代,您都将获得新鲜的对象。