在Chrome中滚动页面时,无法使用Selenium C#填充元素

时间:2018-07-04 18:45:41

标签: c# selenium selenium-chromedriver

我要抓取的网站是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的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()行失败,因为它试图访问elementList的索引-1,因为它的Count为0。

我无法理解为什么我之前至少可以使用页面上的某些元素来填充元素列表,但是当我使用do-while循环时却什么也没得到。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

理想情况下,它应该与滚动一起工作。滚动时检查是否有任何作业事件被触发。如果是这样,请尝试从IJavaScripExecutor调用该函数。这也应该使您充满元素。