【问题标题】:Stale element: iterating through webelement list python陈旧的元素:遍历webelement list python
【发布时间】:2021-01-02 03:11:09
【问题描述】:

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

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

<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")

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

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

我该如何解决这个问题?

【问题讨论】:

  • 请提供网站链接。
  • 添加完整代码,以便任何人都可以尝试
  • 先获取队伍数量。然后使用从 0 到团队数的范围。然后使用索引来查找具有 xpath.browser.find_elements_by_class_name("cartola-card-thin__nome__time")[1].click() 应该为你做的元素。每次进入嵌套循环以单击和离开页面时都是一样的。

标签: python selenium web-scraping web-crawler


【解决方案1】:

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)

【讨论】:

  • 你是对的,下拉菜单是折叠的。我不太明白你所说的使用团队索引的定位器是什么意思
  • 我的意思是,必须在每次迭代中单独定位一个团队元素(或者正如 Arundeep Chohan 在评论中建议的那样 - 您可以在每次迭代中找到所有元素 - 重要的是要避免陈旧的元素例外,您必须在每次下拉展开后找到元素)。 “团队索引”是指来自 for 循环的变量 i。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2018-04-08
  • 2021-05-10
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多