Перейти к содержимому

Фотография

Некорректная работа Selenium и C#

c# selenium firefox

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 alignat

alignat

    Новый участник

  • Members
  • Pip
  • 3 сообщений

Отправлено 04 марта 2017 - 23:46

Возникла следующая проблема (используется Firefox 51, Selenium IDE 2.9, Visual Studio 2015)
 
Записал простой тест: логин и логаут на сайте.
Если запуск производится в Selenium IDE, то все ОК.
 
Запускаю через Visual Studio. Ошибка
 
Result StackTrace:
в OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   в OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   в OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
   в OpenQA.Selenium.Remote.RemoteWebDriver.FindElementByLinkText(String linkText)
   в OpenQA.Selenium.By.<>c__DisplayClass6.<LinkText>b__4(ISearchContext context)
   в OpenQA.Selenium.By.FindElement(ISearchContext context)
   в OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
   в SeleniumTests.Untitled.TheUntitledTest() в C:\Users\Александр\Source\Repos\first_testing\adressbook-web-tests\adressbook-web-tests\UnitTest3.cs:строка 55
Result Message: OpenQA.Selenium.NoSuchElementException : Unable to locate element: Выход
 
Если пройти в режиме отладки пошагово, то все ОК. Тест зеленый.
Никак не могу понять почему элемент по шагам находится, а при полном прогоне нет.
 
Ниже код теста
 
P.S. Если вопрос обсуждался уже, то подскажите где посмотреть. Поиском не нашел.
 
 
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
 
namespace SeleniumTests
{
    [TestFixture]
    public class Untitled
    {
        private IWebDriver driver;
        private StringBuilder verificationErrors;
        private string baseURL;
        private bool acceptNextAlert = true;
 
        [SetUp]
        public void SetupTest()
        {
            driver = new FirefoxDriver();
            baseURL = "http://software-testing.ru/";
            verificationErrors = new StringBuilder();
        }
 
        [TearDown]
        public void TeardownTest()
        {
            try
            {
                driver.Quit();
            }
            catch (Exception)
            {
                // Ignore errors if unable to close the browser
            }
            Assert.AreEqual("", verificationErrors.ToString());
        }
 
        [Test]
        public void TheUntitledTest()
        {
            driver.Navigate().GoToUrl(baseURL + "/forum/");
            driver.FindElement(By.Id("sign_in")).Click();
            driver.FindElement(By.Id("ips_username")).Click();
            driver.FindElement(By.Id("ips_username")).Clear();
            driver.FindElement(By.Id("ips_username")).SendKeys("*****");
            driver.FindElement(By.Id("ips_password")).Click();
            driver.FindElement(By.Id("ips_password")).Clear();
            driver.FindElement(By.Id("ips_password")).SendKeys("*****");
            driver.FindElement(By.Id("inline_remember")).Click();
            driver.FindElement(By.CssSelector("input.ipsButton")).Click();
            driver.FindElement(By.LinkText("Выход")).Click();
        }
        private bool IsElementPresent(By by)
        {
            try
            {
                driver.FindElement(by);
                return true;
            }
            catch (NoSuchElementException)
            {
                return false;
            }
        }
 
        private bool IsAlertPresent()
        {
            try
            {
                driver.SwitchTo().Alert();
                return true;
            }
            catch (NoAlertPresentException)
            {
                return false;
            }
        }
 
        private string CloseAlertAndGetItsText()
        {
            try
            {
                IAlert alert = driver.SwitchTo().Alert();
                string alertText = alert.Text;
                if (acceptNextAlert)
                {
                    alert.Accept();
                }
                else
                {
                    alert.Dismiss();
                }
                return alertText;
            }
            finally
            {
                acceptNextAlert = true;
            }
        }
    }
}
 

  • 0

#2 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 05 марта 2017 - 07:47

Самый очевидный вариант - при полном прогоне элемент не успевает подгрузиться.
Добавьте в SetUp
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

  • 0

#3 alignat

alignat

    Новый участник

  • Members
  • Pip
  • 3 сообщений

Отправлено 05 марта 2017 - 09:37

Самый очевидный вариант - при полном прогоне элемент не успевает подгрузиться.
Добавьте в SetUp

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

Добавил.

[SetUp]
        public void SetupTest()
        {
            driver = new FirefoxDriver();
            driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
            baseURL = "http://software-testing.ru/";
            verificationErrors = new StringBuilder();
        }

Ошибку выдает:

 

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Missing 'type' parameter (IndexOutOfBounds)
  Source=WebDriver
  StackTrace:
       в OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
       в OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
       в OpenQA.Selenium.Remote.RemoteTimeouts.ExecuteSetTimeout(String timeoutType, TimeSpan timeToWait)
       в OpenQA.Selenium.Remote.RemoteTimeouts.ImplicitlyWait(TimeSpan timeToWait)
       в SeleniumTests.Untitled.SetupTest() в C:\Users\Александр\Source\Repos\first_testing\adressbook-web-tests\adressbook-web-tests\UnitTest3.cs:строка 24
  InnerException: 
 
И кроме того, говорит, что метод TimeSpan устаревший

  • 0

#4 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 05 марта 2017 - 14:33

Для начала в качестве отладки можно поставить между строками:

driver.FindElement(By.CssSelector("input.ipsButton")).Click();
Thread.Sleep(5000); //кол-во миллисекунд паузы
driver.FindElement(By.LinkText("Выход")).Click();

Если тест пройдет, значит элемент не успевает загрузиться и дальше уже допиливать тест. Разумеется в пошаговом режиме скорость выполнения теста ниже.

Насколько я помню, когда я писал тесты на C# я добавлял свои команды ClickAndWait (когда происходит обновление страницы) и поиска элементов, так как стандартные часто "сбоили".


  • 0

#5 alignat

alignat

    Новый участник

  • Members
  • Pip
  • 3 сообщений

Отправлено 05 марта 2017 - 19:40

Спасибо!

Совет Snap сработал.


  • 0

#6 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 06 марта 2017 - 09:45

Спасибо!

Совет Snap сработал.

Если вы про совет с паузой, то рассматривать его как выход из положения не совсем верно. Более правильно в последствии либо настроить 

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

либо вместо команды FindElement использовать свою команду, которая будет искать некоторое время элемент и, например, возвращать false, если ничего не найдено.


  • 0



Темы с аналогичным тегами c#, selenium, firefox

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных