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

Фотография

Работа с FindElements


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

#1 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 20 декабря 2011 - 09:19

Здравствуйте!
Столкнулся с такой проблемой:
Есть страница на которой есть ряд ссылок(по которым нужно прокликать), все ссылки находятся в теге <div id="DivId"> .
Получаю все эти ссылки следующим образом :
ReadOnlyCollection<IWebElement> ElementCollection = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a"));
Коллекция создаётся без ошибок.
Дальше делаю клик на эти ссылки:
foreach (IWebElement Element in ElementCollection )
       {
           Element.Click();
           WaitPage(10);
           driver.Navigate().GoToUrl("http://....");
           Delay(10);
                    
       }

Такая функция отрабатывает 1 раз потом возникает ошибка:
Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.

В чём проблема ???
Пишу на C#.
  • 0

#2 D2Phoenix

D2Phoenix

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

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 20 декабря 2011 - 09:35

Лучше так список элементов получать:
List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

Update: Если всё ещё будет ошибку выдавать попробуйте циклом for воспользоваться
  • 0

#3 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 20 декабря 2011 - 10:07

Лучше так список элементов получать:

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

Update: Если всё ещё будет ошибку выдавать попробуйте циклом for воспользоваться

Попробовал списком, но всё равно падает. А как именно использовать цикл for.
  • 0

#4 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 20 декабря 2011 - 10:12

Изменил немного код, и понял что ошибка возникает только при втором клике:

int i = 0;
       ReadOnlyCollection<IWebElement> El = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a"));
       IWebElement[] ElArr=new IWebElement[El.Count];
       string[] HrefObj = new string[El.Count];
       string[] TextLink=new string[El.Count];
       El.CopyTo(ElArr, 0);
      
       //Привожу все элементы к типу IWebElement
       while (i < ElArr.Length)
       {
           ElArr[i] = (IWebElement)ElArr[i];
           i++;
       }
       i = 0;

      //Получаю значения текста и адрес ссылки
       while (i < ElArr.Length)
       {
           TextLink[i] = ElArr[i].Text;
           HrefObj[i] = ElArr[i].GetAttribute("href");
           
       }
        i=0;
       //Пытаюсь кликнуть по объекту, выходит только первый элемент второй вызывает ошибку.
       while (i < ElArr.Length)
       {
           ElArr[i].Click();
           WaitPage(10);
           driver.Navigate().GoToUrl("http://....");
       }

Почему ошибка возникает именно там ?
  • 0

#5 D2Phoenix

D2Phoenix

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

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 20 декабря 2011 - 10:54

Хотя возможно из-за того что вы снова открываете страницу в цикле и, всвязи с этим, вам снова нужно найти все элементы (хотя это не вяжется с получаемой ошибкой).
Вот так попробуй:
int linkCount= driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).Count;

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

 for (int i = 0; i <= linkCount-1; i++ )
        {
                linksToClick[i].Click();
                WaitPage(10);
                driver.Navigate().Back();

        }


Либо:
int linkCount= driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).Count;

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

 for (int i = 0; i <= linkCount-1; i++ )
        {
                linksToClick[i].Click();
                WaitPage(10);
                driver.Navigate().GoToUrl("http://....");
                linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

        }
В коде ошибки могут быть (нет под рукой компилятора c#, да и не писал давно на нём ничего)) но принцип должен быть понятен)

Update:
int linkCount= driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).Count;

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();
заменить на это
List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

int linkCount = linksToClick.Count;

  • 0

#6 D2Phoenix

D2Phoenix

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

  • Members
  • PipPipPip
  • 200 сообщений
  • ФИО:Чадюк Вадим
  • Город:Гродно


Отправлено 20 декабря 2011 - 11:30

И что делает метод
WaitPage(10);
Если просто ждёт 10 секунд, то лучше включить имплицидные ожидания, а то вдруг странице понадобится 11 секнуд и тест сразу же завалится
  • 0

#7 Lemur

Lemur

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

  • Members
  • PipPipPipPip
  • 265 сообщений
  • ФИО:Левиков Владимир Владимирович

Отправлено 20 декабря 2011 - 11:44

Хотя возможно из-за того что вы снова открываете страницу в цикле и, всвязи с этим, вам снова нужно найти все элементы (хотя это не вяжется с получаемой ошибкой).
Вот так попробуй:

int linkCount= driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).Count;

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

 for (int i = 0; i <= linkCount-1; i++ )
        {
                linksToClick[i].Click();
                WaitPage(10);
                driver.Navigate().Back();

        }


Либо:
int linkCount= driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).Count;

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

 for (int i = 0; i <= linkCount-1; i++ )
        {
                linksToClick[i].Click();
                WaitPage(10);
                driver.Navigate().GoToUrl("http://....");
                linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

        }
В коде ошибки могут быть (нет под рукой компилятора c#, да и не писал давно на нём ничего)) но принцип должен быть понятен)

Update:
int linkCount= driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).Count;

List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();
заменить на это
List<IWebElement> linksToClick = driver.FindElement(By.Id("DivId")).FindElements(By.TagName("a")).ToList();

int linkCount = linksToClick.Count;

Огромнейшее спасибище за код!!!
Второй код запустился и работает. :)
  • 0


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

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