C # Как сохранить Selenium WebElement в памяти, чтобы успеть узнать его детали - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь шпионить за веб-сайтом с Selenium и C #, чтобы посмотреть, появятся ли на нем новые элементы. На этом веб-сайте у меня есть список <div class="myClass"> элементов, отображаемых в виде таблицы со множеством подразделов. Периодически я читаю все отображаемые элементы и проверяю наличие нового. Но количество div-ов ограничено, и когда появляется новый элемент, самый старый удаляется, и это создает проблему в моем коде.

Пример: Максимальное количество элементов равно 3.

  1. Я получаю 3 предмета A, B, C .
  2. появляется новый элемент D .
  3. Я прочитал 3 отображаемых элемента: когда я читаю все вложенные элементы из D , появляется новый элемент E и D переехал, и я получаю сообщение об ошибке типа «Элемент больше не подключен к DOM»

Я получаю эту ошибку, потому что чтение всех D sub div слишком длинное.

Я получаю webelement, используя FindElement(By.Name("elemName") Есть ли способ сохранить элемент в памяти, даже если этот элемент перемещен или удален из DOM?

Спасибо!

1 Ответ

1 голос
/ 06 ноября 2019

Это интересная проблема, с которой я сталкивался в прошлом. Через несколько разочаровывающих сеансов отладки я обнаружил, что мои WebElement объекты динамически менялись в зависимости от того, что было видно на странице. Я бы извлек List<WebElement>, изменил что-то на странице и заметил, что мой List<> действительно изменился бы с содержанием на странице.

Чтобы ответить на ваш вопрос ..... Я неполностью уверен, если это возможно, хранить WebElement сам, не удаляя старый div, как вы упомянули.

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

Вотнебольшой пример:


public class Element
{
    public string TagName { get; set; }
    public string Text { get; set; }
    public bool Displayed { get; set; }
    // any other attributes you want to store here
}

public List<Element> StoreWebElements(List<IWebElement> seleniumElements)
{
    var result = new List<Element>();
    foreach (var elem in seleniumElements)
    {
       result.Add(new Element { TagName = elem.TagName,
                                Text = elem.Text, 
                                Displayed = elem.Displayed
                               };
    }
}


// your code
var divList = Driver.FindElements(By.Name("elemName"));

// "store" the elements
var cachedElements = StoreWebElements(divList);

// do something on the page to change it 
// divList will change, but cachedElements will stay the same.

Это немного хакерское решение, но лично я никогда не находил обходного пути к проблеме, которую вы описали. Мне было бы любопытно узнать, есть ли у кого-нибудь еще объяснение или лучшее решение для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...