Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Помогите получить данные из html и записать их в класс с объектами с помощью C#+Selenium


(Vlad Topov) #1

Добрый день.

<td class="tfDepart " valign="top"> 6:00am <div class="tfDepAp">
         Minsk, Belarus <span title="Minsk International Airport">          (MSQ)</span> </div>

<td class="tfDepart" valign="top"> 10:50am <div class="tfDepAp">
         Minsk, Belarus  <span title="Minsk International Airport">  (MSQ)</span> </div>

Как мне получить метод который возвращает коллекцию объектов из html

public IEnumerable<Fly> FlyTransport() в которой будут хранится время и город со строной.

Класс Fly описан ниже

class Fly
{  string Time{get;set;}
   string City{get;set;}
}

И как можно получить содержимое элемента, чтобы проверить его с ожидаемым?


(Дмитрий Жарий) #2

@vladtopov71, пожалуйста уточните, на каком шаге у вас возникают проблемы:

  1. При помощи метода FindElements(By…) и используя CSS/XPath локаторы, получить список всех элементов TD – CSS: td.tfDepart
  2. В цикле, для каждого элемента из списка, из свойства IWebElement.Text – извлечь текст
  3. При помощи строковых операций или регулярных выражений, извлечь из текста время и город

(Vlad Topov) #3

Проблема вот в чем

IList<IWebElement> time = driver.FindElements(By.CssSelector("td.tfDepart"));
foreach (IWebElement tm in time)
           {
              
           }

И на пункте 2 завис
А дальше я хочу получить метод public IEnumerable FlyTransport(){ }, который вернет мне набор объектов Time и City. Мне надо, чтобы в проперти Time хранился список в котором
было бы 6:00am, 10:50am.
Вот собственно в этом и проблема.


(Александр Таранков) #4

Идея такая:

IList<IWebElement> departs = driver.FindElements(By.CssSelector("td.tfDepart")); 

foreach (IWebElement dep in departs)
           {
             // объект для упаковки
              Fly fly = new Fly();

              // вытащить время
              fly.setTime(dep.getText());

              // вытащить город
              fly.setCity(dep.findElement(By.xpath("./div")).getText());

          }  
}

P.S. написано на псевдо-C#, код вероятно не рабочий

P.P.S. не уверен что вернет getText() в случае с Time, возможно туда же попадет и City, тогда эту строку можно распилить регекспом(сплит и т.п.) и соответствующим образом переделать код.

Но идея должна быть понятна :smile:


(Дмитрий Жарий) #5

Поддерживаю вариант @joemast, действительно тут самый хитрый участок, это поиск города посредством веб-элемента, а не через драйвер.

Вот вариант на C#

List<Fly> result = new List<Fly>();
            
IList<IWebElement> items = driver.FindElements(By.CssSelector("td.tfDepart"));
foreach (IWebElement tm in items)
{
    string flyTdText = tm.Text; //@" 6:00am          Minsk, Belarus           (MSQ)"
    flyTdText = flyTdText.Trim();
                
    string departTime = flyTdText.Split(' ')[0]; // Первый элемент из строки, разбитой по пробелам

    string departCity = tm.FindElement(By.CssSelector("div.tfDepAp")).Text;

    var listItem = new Fly()
    {
        Time = departTime,
        City = departCity
    };

    result.Add(listItem);
}


(Vlad Topov) #6

joemast и Дмитрий спасибо вам за помощь.