VS / Selenium — Ссылка на объект не установлена на экземпляр объекта с нулевым драйвером

#c# #selenium #unit-testing #object-reference

#c# #селен #модульное тестирование #ссылка на объект #selenium

Вопрос:

Я пытаюсь получить список iFrames на странице, но по какой-то причине я продолжаю получать две ошибки. А именно, я получаю нулевой драйвер и «Ссылка на объект не установлена на экземпляр объекта», когда я это делаю var iFrame = driver.FindElements(By.TagName("frame")); . Я потратил полдня, пытаясь разобраться в этом, и я чувствую, что застряну в колее, если не попрошу помощи по переполнению стека.

Класс базового фрейма:

 public class BaseIFrame
    {

        protected IWebDriver _driver;
        private ReadOnlyCollection<IWebElement> _elements;
        private ReadOnlyCollection<IWebElement> _iframes;

        public BaseIFrame(IWebDriver _driver)
        {
            this._driver = _driver;
            _iframes = _driver.FindElements(By.TagName("frame"));
            _elements = new ReadOnlyCollection<IWebElement>(_iframes);
        }

        public void GetAlliFrames()
        {
            try
            {
                if (_elements.Count > 0)
                {
                    _driver.SwitchTo().Frame(0);
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.FormatExceptionMessage(this));
                throw;
            }
        }
   }
  

BaseiFrameTests метод класса, который вызывает класс BaseiFrame

     public class BaseiFrameTests : SharedBase
    {
        protected IWebDriver _driver;
        private BaseConfig config;
        private BaseConfig initialUrl;

        //string url = "http://127.0.0.1:1024/";

        public BaseiFrameTests()
        {
        }

        public override BaseConfig getConfig()
        {
            return new Config
            {
                initialUrl = "http://the-internet.herokuapp.com/nested_frames"
            };
        }

        public override BaseConfig loadConfig()
        {
            return new BaseConfig();
        }

        public override IWebDriver getDriver()
        {
            return instantiateWebDriver("edge");
        }

        [TestMethod]
        public void AssertiFrameLength()
        {
            BaseIFrame bif = new BaseIFrame(_driver);
            bif.GetAlliFrames();
        }
   }
  

Комментарии:

1. this._driver = _driver; я подозреваю, что проблема в именовании драйвера. можете ли вы попробовать использовать другие имена драйверов

2. можете ли вы поделиться кодом, в котором вы создаете экземпляр своего драйвера, и как вы добираетесь до этого класса? — я вижу, что вы передаете это в конструкторе, но потенциально ли это значение равно null?

3. Я должен посмотреть, смогу ли я. Мой webdriver создается из класса BaseiFrameTest через сложный интерфейс, созданный компанией, в которой я работаю. Мне удалось успешно запустить драйвер в BaseiFrameTest… но мне пришлось пройти через обручи, чтобы сделать это достаточно интересно.

4. Посмотри, что ты можешь сделать, приятель 🙂 — complex interface всегда звучит забавно. При необходимости выполните простой тест за пределами вашего приложения. Перейдите куда-нибудь, например, в Google, и введите что-нибудь в поиске. Это гарантирует, что ваш драйвер работает, и это не имеет ничего общего с вашими фреймами или тестируемым приложением.

5. Только что получил зеленый свет! Однако мой руководитель сказал, что не более того, поскольку он углубляется в нашу основную базу кода автоматизации. Внесены изменения. Надеюсь, они помогут

Ответ №1:

Обновление: я смог устранить свою проблему, инициализировав getDriver() onto new BaseiFrame(); в AssertiFrameLength методе.