陈旧元素:遍历 webelement 列表 python

时间:2021-01-02 03:11:09

标签: python selenium web-scraping web-crawler

我第一次使用 selenium 来获取一些关于我和朋友玩的梦幻足球游戏的信息(我们有一个比赛)。我在遍历 webelement 列表时遇到了问题。显然它们变得陈旧。 下面是一些代码和细节:

我能够自己进入比赛页面。这个页面有比赛中每支球队的卡片,它们看起来像这样

<span class="cartola-card-thin__nome__time">TEAM1</span>

点击后,这些卡片会转到该团队的页面。此页面包含一个如下所示的下拉菜单

<span class="cartola-dropdown-bg__botao cartola-dropdown-bg-botao-rodada-id cartola-dropdown-bg__botao--aberto" ng-class="'cartola-dropdown-bg-botao-' + name"></span>

并且此菜单包含每轮比赛的 div。看起来像这样

<div ng-if="!hasDescription" class="cartola-dropdown-bg__selecao" ng-bind="item.label">rodada 25</div>

点击后,每个 div 都会加载该特定球队的阵型及其在该回合中的得分。点在页面上显示如下:

<div class="cartola-time-adv__pontuacao pont-positiva" ng-class="{'pont-positiva': ctrl.timeService.dadosTime.pontos > 0,
                    'pont-negativa': ctrl.timeService.dadosTime.pontos < 0}" ng-bind="ctrl.timeService.dadosTime.pontos != null ? ctrl.timeService.dadosTime.pontos : ''">78.17</div>

我的目标:我想在 dict['round'] = points 中收集每一轮比赛中每支球队的积分。

我已经尝试过的:我尝试通过执行将团队保留在列表中

teams = browser.find_elements_by_class_name("cartola-card-thin__nome__time")

然后,对于团队中的每个团队,我都会点击它。 在那个页面上我会发现每一轮都是这样的

rounds = browser.find_elements_by_class_name("cartola-dropdown-bg__selecao")

然后,对于每一轮中的每一轮,我都会点击它并获得该轮的积分。

问题:我遍历团队和回合的那些循环不起作用,因为显然在循环内的整个过程(点击等)之后,这些网络元素变得陈旧

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

Angular 下拉元素在运行时重建。下拉折叠后 - 先前找到的下拉项目不再是 DOM 元素。当下拉菜单再次展开时,它再次添​​加到 DOM 中 - 但它不是 WebDriver 的相同元素(即使可以使用相同的定位器找到它)。

因此,您遵循以下逻辑:

  1. 展开下拉
  2. 获取下拉元素 ->
teams = browser.find_elements_by_class_name("cartola-card-thin__nome__time")
  1. 为每个团队做一些事情 -> 在这里,我想,那个下拉菜单被折叠了。所以发现 WebElements 不再在 DOM 中 -> stale element exception

你必须做什么?

teamsCount = len(teams);
teamIndexes = range(teamsCount)
for(i in temIndexes)
    team = driver.find_element(locator_that_usesTeamIndex)