Chrome驱动程序无法找到网页上的元素,即使我之前已经对其进行了验证

时间:2019-07-13 09:40:14

标签: c# selenium-webdriver selenium-chromedriver

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

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

不幸的是,在对我的代码实施了更改(POM的第一种方法)后,我的Web驱动程序实现了

  1. 打开url并加载网页而不查找元素,然后打开一个新的空白窗口并重复三到四次。
  2. 尝试查找元素时崩溃

我查找了一些类似的问题,并在定位元素之前尝试实现一些代码,但是:

  • Driver.SwitchTo()。DefaultContent(); --->对我没有任何作用
  • Driver.Manage()。Timeouts()。ImplicitWait = TimeSpan.FromSeconds(2); ---->也没有帮助

这是可以正常工作的代码:

命名空间Seleniumtest1     {         班级计划         {             静态void Main(string [] args)             {                 var driver = new ChromeDriver();

            driver.Url = "http://automationpractice.com/index.php";

            var newSearch = driver.FindElement(By.Id("search_query_top"));
            newSearch.SendKeys("top");
            var searchConfrim = driver.FindElement(By.Name("submit_search"));

            searchConfrim.Click();

        }
    }
} 

这是我尝试实现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:没有这样的元素:无法找到元素:{” method“:” id“,” selector“:” search_query_top“}”

任何人都可以帮助解决此问题或指出问题的可能原因吗?

1 个答案:

答案 0 :(得分:1)

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

public IWebDriver Driver
    {
        get { return new ChromeDriver(); }
    }

对于您的示例,您只需创建一次ChromeDriver实例即可,例如,使用私有属性:

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

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