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

Фотография

Не нажать на кнопку, InvalidOperationException was unhandled by user c

css

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

#1 kulkse

kulkse

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

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

Отправлено 23 августа 2015 - 21:24

Здравствуйте

 

Подскажите, пожалуйста, как достать элемент? "Битый час" пытаюсь, не получается  :sad:  код страницы элемента во вложенном файле. Надо нажать на кнопку "Да" .yes. Пытаюсь достать элемент с помощью css селектора.

Если написать просто : 

var metroYesClass = _driver.FindElement(By.CssSelector(".yes"));

то возникает эксэпшн "An exception of type 'System.InvalidOperationException' occurred in WebDriver.dll but was not handled in user code"

всё ломается на элементе классе  b-detect-city - он какой-то не такой

 

C# WebDriver Selenium 2.0 

Прикрепленные файлы


  • 0

#2 kulkse

kulkse

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

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

Отправлено 24 августа 2015 - 06:38

Кнопка, которую я пытаюсь нажать находится здесь https://krsk.metro-c...ton:actions:opv


  • 0

#3 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 24 августа 2015 - 13:07

Что у нас с ожиданием этого элемента?

Поставьте побольше задержку перед нахождением этого элемента.

Вы не написали версии всего того что вы используете.


  • 0

#4 kulkse

kulkse

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

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

Отправлено 24 августа 2015 - 19:44

"Что у нас с ожиданием этого элемента?" 

тут дело не в ожидании(( пытаюсь получить элемент хотя бы в debug, когда уже вся страница загрузилась и отобразилась...

 

"Вы не написали версии всего того что вы используете." а этого недостаточно? "C# WebDriver Selenium 2.0 "


  • 0

#5 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 24 августа 2015 - 21:02

нужно выставить ожидание с условием видимости элемента по xpath. Попробовал сейчас быстро у себя накидать, всё работает и кнопка находится.


  • 0

#6 kulkse

kulkse

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

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

Отправлено 24 августа 2015 - 21:28

всё таки ожидание?!  :sad:  ладно, пойду тугодумить над ожиданием..

спасибо))


  • 0

#7 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 25 августа 2015 - 07:59

нужно выставить ожидание с условием видимости элемента по xpath.

про видимость по xPath не забудьте. У меня тоже нашлось по xPath


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#8 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 25 августа 2015 - 08:01

А версии селениума, браузера, драйвера к браузеру.


  • 0

#9 kulkse

kulkse

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

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

Отправлено 25 августа 2015 - 21:20

нужно выставить ожидание с условием видимости элемента по xpath. Попробовал сейчас быстро у себя накидать, всё работает и кнопка находится.

 

а кусочком кода ожидания не поделитесь? 


  • 0

#10 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 25 августа 2015 - 21:42

 

нужно выставить ожидание с условием видимости элемента по xpath. Попробовал сейчас быстро у себя накидать, всё работает и кнопка находится.

 

а кусочком кода ожидания не поделитесь? 

 

Могу только на Java


  • 0

#11 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 26 августа 2015 - 10:03

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace BDPUiTest.Tests
{
    [TestFixture]
    public class Learning
    {
        [Test]
        public void TestPositive()
        {
            var Driver = new ChromeDriver();
            Driver.Manage().Window.Maximize();
            Driver.Navigate().GoToUrl("https://krsk.metro-cc.ru/?icid=ru:button:actions:opv");
            var yesBtn = Driver.FindElement(By.XPath("//div[@class='yes']"));
            yesBtn.Click();
            Driver.Quit();
        }
    }
}

вот на C#


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#12 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 26 августа 2015 - 10:51

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace BDPUiTest.Tests
{
    [TestFixture]
    public class Learning
    {
        [Test]
        public void TestPositive()
        {
            var Driver = new ChromeDriver();
            Driver.Manage().Window.Maximize();
            Driver.Navigate().GoToUrl("https://krsk.metro-cc.ru/?icid=ru:button:actions:opv");
            var yesBtn = Driver.FindElement(By.XPath("//div[@class='yes']"));
            yesBtn.Click();
            Driver.Quit();
        }
    }
}

вот на C#

 

Здесь нет ожидания, тест может упасть


  • 0

#13 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 26 августа 2015 - 12:02

Здесь нет ожидания, тест может упасть

Ожидание чего? открытия страницы? это вшито в GoToUrl(string)

Если же мы попадаем на эту страницу по клику по ссылке, действительно, нужно ожидание. Вот Вам такое:

using System;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using WatiN.Core;

namespace BDPUiTest.Tests
{
    [TestFixture]
    public class Learning
    {
        ChromeDriver Driver = new ChromeDriver();
        [Test]
        public void TestPositive()
        {
            
            Driver.Manage().Window.Maximize();
            Driver.Navigate().GoToUrl("https://krsk.metro-cc.ru/?icid=ru:button:actions:opv");
            var yesBtn = GetElementAfterWaiting("//div[@class='yes']");
            yesBtn.Click();
            Driver.Quit();
        }

        private IWebElement GetElementAfterWaiting(string xPath, int timeoutInSec = 30)
        {
            for (var i = 0; i < timeoutInSec; i++)
            {
                try
                {
                    return Driver.FindElement(By.XPath(xPath)); //Пытаемся вернуть этот элемент
                }
                catch (Exception e) 
                {
                    if (e is NoSuchElementException || e.InnerException is NoSuchElementException) //Не знаю почему, но NoSuchElementException иногда оборачивается в другой эксепшн, я заводил тему недавно
                    {
                        Thread.Sleep(1000);//Тут можно использовать любое другое ожидание
                    }
                    else throw; //на случай каких-либо ещё эксепшенов, можно эту строчку убрать
                }
            }
            throw new NoSuchElementException("Элемент не найден."); //Генерим NoSuchElementException, если по прошествии таймаута элемент так и не найден
        }
    }
}


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#14 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 26 августа 2015 - 12:07

Ожидание всплывающего модального окна. А использовать ExpectedConditions не судьба? Зачем изобретать велосипед?


  • 1

#15 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 26 августа 2015 - 12:26

Ожидание всплывающего модального окна. А использовать ExpectedConditions не судьба? Зачем изобретать велосипед?

Одну строчку было несолидно писать :)

 

А вообще, я нагородил чисто ожидание. А его можно расширить всякими доп.условиями, проверками, действиями и прочее...


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#16 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 26 августа 2015 - 14:10

А вообще, я нагородил чисто ожидание. А его можно расширить всякими доп.условиями, проверками, действиями и прочее...

Все уже "нагорожено" до вас:
http://seleniumhq.gi...bDriverWait.htm
  • 0

#17 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 26 августа 2015 - 14:31

 

А вообще, я нагородил чисто ожидание. А его можно расширить всякими доп.условиями, проверками, действиями и прочее...

Все уже "нагорожено" до вас:
http://seleniumhq.gi...bDriverWait.htm

 

Повторяю, мой способ - расширяемый. Он не идеален, может быть, но расширяемый - точно. WebDriverWait'а мне не хватило. А тут я привёл не весь свой код.

Но согласен, в данном случае можно его использовать, тут я загнался...


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#18 kulkse

kulkse

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

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

Отправлено 28 августа 2015 - 09:57

Ребята, спасибо за кусочки кода...но у меня по-прежнему не ловится элемент((

vkazar, твой код у тебя кликает по кнопке Да?

OpenChromNewWindow(Settings.Default.MetroBaseUrl);
WaitForAjaxRequestsToFinish();
var yesBtn = GetElementAfterWaiting("//div[@class='yes']");
yesBtn.Click();

у меня, в итоге, вываливается эксепшн An exception of type 'OpenQA.Selenium.NoSuchElementException' occurred in IzmenitNazvanie.dll but was not handled in user code

Код сваливается на строчку throw new NoSuchElementException("Элемент не найден.");

:sad: Ерунда какая-то(((


  • 0

#19 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 28 августа 2015 - 10:12

а глазами вы эту кнопку видите? если поставить точку останова на var yesBtn = GetElementAfterWaiting("//div[@class='yes']"); и запустить в дебаге?
попробуйте тогда эту строчку действительно заменить на:

var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30))
var yesBtn = wait.Until(Driver=> Driver.FindElement(By.XPath("//div[@class='yes']")));

и без всяких велосипедов.

У меня и старый код отработал, Chrome + Selenium WebDriver на C# 


  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©


#20 vkazar

vkazar

    Активный участник

  • Members
  • PipPip
  • 128 сообщений
  • ФИО:Виктор
  • Город:Москва

Отправлено 03 сентября 2015 - 10:08

var yesBtn = wait.Until(Driver=> Driver.FindElement(By.XPath("//div[@class='yes']")));

Проблема копипасты. Конечно же, wait.Until(_ => Driver.FindElement(By.XPath("//div[@class='yes']")))
  • 0

Тестировщик должен быть умнее программиста... ну, по крайней мере, хитрее. ©




Темы с аналогичным тегами css

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

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