Элементы, не заполняемые с помощью Selenium C # с прокруткой страниц в Chrome - PullRequest
0 голосов
/ 04 июля 2018

Сайт, который я пытаюсь почистить, - https://hitbtc.com/market-overview/overview.

Я пытаюсь получить пары монет криптовалюты со страницы, открыв следующий html (и другой аналогичный html для других пар монет):

<div class="ReactVirtualized__Table__row ReactVirtualized__Row__odd ReactVirtualized__Table__row ReactVirtualized__Row__odd animation__redToWhite--2EMEW" role="row" style="height: 30px; left: 0px; position: absolute; top: 0px; width: 1202px; overflow: hidden; padding-right: 0px;">
    <div class="ReactVirtualized__Table__rowColumn" role="gridcell" style="flex: 0 1 200px; overflow: hidden;">
        **<a href="/BTC-to-USDT" style="color: rgb(55, 71, 79); text-decoration: none;">BTC/USDT</a>**
    </div>
    <div class="ReactVirtualized__Table__rowColumn" role="gridcell" style="flex: 0 1 200px; overflow: hidden;">
        <div>
            <div class="styles__imgUp--1O8Kn"></div>
            1.92%
        </div>
    </div>
    <div class="ReactVirtualized__Table__rowColumn" role="gridcell" title="₮ 59 843 794" style="flex: 0 1 200px; overflow: hidden;">₮ 59 843 794</div>
    <div class="ReactVirtualized__Table__rowColumn" role="gridcell" title="₮ 6780.73" style="flex: 0 1 200px; overflow: hidden;">₮ 6780.73</div>
    <div class="ReactVirtualized__Table__rowColumn" role="gridcell" title="₮ 6486.82" style="flex: 0 1 200px; overflow: hidden;">₮ 6486.82</div>
    <div class="ReactVirtualized__Table__rowColumn" role="gridcell" title="₮ 6833.25" style="flex: 0 1 220px; overflow: hidden;">₮ 6833.25</div>
</div>

Я хочу получить текст из первого тега, который должен дать мне «BTC / USDT». Я обнаружил, что с помощью Selenium's Driver.FindElements () я получу только первые 29 элементов (т.е. те, которые отображаются без прокрутки). Из-за этого я попытался реализовать цикл do-while для прокрутки вниз страницы, получения списков элементов и добавления их в основной список, пока ранее полученный список не совпадал с текущим списком (достигнута нижняя часть страницы). Вот мой код:

List<IWebElement> totalElemList = new List<IWebElement>();
List<IWebElement> elementList = new List<IWebElement>();
List<IWebElement> prevList = new List<IWebElement>();

do
{
    prevList.Clear();
    prevList.AddRange(elementList);
    totalElemList.AddRange(prevList);
    var infoList = RetryingFind(By.ClassName("ReactVirtualized__Table__row"));
    foreach (var element in infoList)
    {
        elementList.Add(element.FindElement(By.TagName("a")));
    }
    Thread.Sleep(10000);
    ((IJavaScriptExecutor)Browser.Driver).ExecuteScript("arguments[0].scrollIntoView(true);", elementList[elementList.Count - 1]);
}
while (prevList != elementList);

Однако elementList по какой-то причине не заполняется какими-либо элементами. Я добавил Thread.Sleep (), пробуя разные времена ожидания до 10 секунд, но это не решило проблему. Затем происходит сбой строки ExecuteScript (), поскольку он пытается получить доступ к индексу -1 элемента elementList, так как его Count равен 0.

У меня возникают проблемы с пониманием того, почему я раньше мог заполнять список элементов хотя бы некоторыми элементами на странице, но когда я использую цикл do-while, я ничего не получаю. Какие-нибудь мысли?

1 Ответ

0 голосов
/ 05 июля 2018

В идеале должно работать со свитком. Проверьте, есть ли какое-либо событие задания, которое запускается при прокрутке. Если это так, попробуйте вызвать эту функцию из IJavaScripExecutor. Это также должно загрузить вас вашими элементами.

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