C# Chrome驱动程序无法定位网页上的元素,即使我之前已经验证过它们

C# Chrome驱动程序无法定位网页上的元素,即使我之前已经验证过它们,c#,selenium-webdriver,selenium-chromedriver,C#,Selenium Webdriver,Selenium Chromedriver,我目前正在学习使用Selenium(Chrome驱动程序)的C#。 我找到了一些可以用于Selenium学习自动化的网站,我有一个非常基本的代码,可以打开url,键入一些内容并搜索结果 然后我想尝试在代码中实现页面对象模型。第一个页面将负责打开url,在搜索框中写入内容并单击“搜索”。 第二个页面将负责收集结果(我的代码中尚未实现) 不幸的是,在对我的代码进行更改(POM的第一种方法)后,我的webdriver: 打开url并加载网页而不查找元素,然后打开一个新的空白窗口并重复三到四次 尝试查找

我目前正在学习使用Selenium(Chrome驱动程序)的C#。 我找到了一些可以用于Selenium学习自动化的网站,我有一个非常基本的代码,可以打开url,键入一些内容并搜索结果

然后我想尝试在代码中实现页面对象模型。第一个页面将负责打开url,在搜索框中写入内容并单击“搜索”。 第二个页面将负责收集结果(我的代码中尚未实现)

不幸的是,在对我的代码进行更改(POM的第一种方法)后,我的webdriver:

  • 打开url并加载网页而不查找元素,然后打开一个新的空白窗口并重复三到四次
  • 尝试查找元素时崩溃
  • 我查找了一些类似的问题,并尝试在定位元素之前实现一些代码,但是:

    • Driver.SwitchTo().DefaultContent();-->对我没有任何帮助
    • Driver.Manage().Timeouts().ImplicitWait=TimeSpan.FromSeconds(2);--->也没用
    这是工作正常的代码:

    名称空间Seleniumtest1 { 班级计划 { 静态void Main(字符串[]参数) { var驱动程序=新的ChromeDriver()

    这是我尝试实现POM后的代码,但不起作用:

    namespace ConsoleApplication_training
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Console.ReadKey();
                var page = new WebPage();
                page.ClickButton();
            }
        }
    
        internal class WebPage
        {
            private IWebDriver driver;
            private string websiteUrl;
    
            public IWebDriver Driver
            {
                get { return new ChromeDriver(); }
            }
    
            public string WebsiteUrl
            {
                get { return "http://automationpractice.com/index.php"; }
    
                set
                {
                    websiteUrl = value;
                }
            }
    
            public WebPage()
            {
                Driver.Navigate().GoToUrl(WebsiteUrl);
                Driver.SwitchTo().DefaultContent();
                Driver.FindElement(By.Id("search_query_top"));
            }
    
            public void ClickButton()
            {
                Driver.FindElement(By.Name("submit_search")).Click();
            }
        }
    }
    
    实际误差为:

    “OpenQA.Selenium.NoSuchElementException:没有这样的元素:无法找到元素:{”方法“:“id”,“选择器“:“search\u query\u top”}”


    有人能帮你解决这个问题吗?或者指出问题的原因是什么?

    问题的根源是对ChromeDriver寿命的误解。 在接下来的代码行中,您将为驱动程序属性的每次调用创建一个新的驱动程序实例

    public IWebDriver Driver
        {
            get { return new ChromeDriver(); }
        }
    
    对于您的示例,您只需创建一次ChromeDriver实例,例如,使用私有属性:

    private readonly IWebDriver _driver = new ChromeDriver();
    public IWebDriver Driver => _driver;
    

    但是如果有多个页面,这种方法会导致其他错误。因此最好单独创建一个web驱动程序实例,并通过构造函数将其传递给页面。

    我还怀疑我弄乱了web驱动程序构造函数,但是如果没有帮助,我永远也无法解决这个问题,所以谢谢你。
    private readonly IWebDriver _driver = new ChromeDriver();
    public IWebDriver Driver => _driver;