xXxRevolutionxXx Ответов: 1

[C#][gecko]получить текст из класса span


- Привет ! Итак, я создаю проект с помощью браузера Gecko(firefox), написанного на C#. Я застрял на определенной вещи. Я хочу получить текст класса span, у которого нет идентификатора. Вот код:

[^]

Я попробовал несколько способов взять эту часть данных, но, похоже, ничего не работает ... и google это все, что он мог мне дать. Есть идеи ? Заранее спасибо.

Что я уже пробовал:

Я попытался получить все элементы класса и перебрать их, а также некоторые другие вещи.

var links = GeckoWB.Document.GetElementsByTagName("span");
            foreach (var link in links)
            {
                if (link.GetAttribute("ipsNotificationCount ipsHide") == "data-currentcount")
                {
                    
                }
            }

madhav_jain

что вы уже пробовали и описали подробнее об этом.

xXxRevolutionxXx

Я обновил вопрос.

1 Ответов

Рейтинг:
6

Richard Deeming

Строка, которую вы передаете в метод GetAttribute[^] метод - это имя атрибута, который вы хотите получить.

Вы проходите в ценность атрибута, называемого class- Это не сработает. Такого атрибута нет и никогда не может быть, потому что имена атрибутов не могут содержать пробелов.

Вы мог измените свой тест на:

if (link.GetAttribute("class") == "ipsNotificationCount ipsHide")
{
    ...
}

Но это было бы неэффективно и, скорее всего, сломалось бы, если бы порядок имен классов изменился или к элементу был добавлен другой класс.

Вместо этого используйте GetElementsByClassName[^] метод поиска элемента (ов) с указанным классом:
var links = GeckoWB.Document.GetElementsByClassName("ipsNotificationCount");
foreach (var link in links)
{
    string value = link.GetAttribute("data-currentcount");
    if (!string.IsNullOrWhiteSpace(value))
    {
        int currentCount;
        if (int.TryParse(value, out currentCount))
        {
            ...
        }
    }
}


xXxRevolutionxXx

Одно исправление к вашему коду. "Var link "в цикле foreach должен быть типом: GeckoHtmlElement или иначе... используя тип данных var, он становится типом GeckoNode и не включает метод" GetAttribute". Теперь проблема с вашим кодом заключается в том, что он возвращает мне ошибку "ССЫЛКА на объект не установлена на экземпляр объекта"... потому что переменная 'links' имеет значение null и не содержит никаких "элементов". Вот мой код:

http://prntscr.com/e8oo33

Это ошибка "аварии": http://prntscr.com/e8oq15

P. S Я использую метод invoker thing, потому что Gecko Browser находится в другом потоке.

Richard Deeming

Это даже отдаленно не удивительно. То BeginInvoke метод возвращает немедленно Код, который следует за ним, будет выполнен до делегат, к которому вы перешли BeginInvoke.

Переместите весь код метода внутрь BeginInvoke делегировать или заставить весь метод работать в потоке пользовательского интерфейса:

private void CountMsgAndNot()
{
    if (InvokeRequired)
    {
        BeginInvoke((Action)CountMsgAndNot);
        return;
    }
    
    var links = GeckoWB.Document.GetElementsByClassName("ipsNotificationCount");
    foreach (GeckoHtmlElement link in links)
    {
        string value = link.GetAttribute("data-currentcount");
        if (!string.IsNullOrWhiteSpace(value))
        {
            MsgLbl.Text = value;
            break;
        }
    }
}