我第一次使用 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")
然后,对于每一轮中的每一轮,我都会点击它并获得该轮的积分。
问题:我遍历团队和回合的那些循环不起作用,因为显然在循环内的整个过程(点击等)之后,这些网络元素变得陈旧
我该如何解决这个问题?
答案 0 :(得分:0)
Angular 下拉元素在运行时重建。下拉折叠后 - 先前找到的下拉项目不再是 DOM 元素。当下拉菜单再次展开时,它再次添加到 DOM 中 - 但它不是 WebDriver 的相同元素(即使可以使用相同的定位器找到它)。
因此,您遵循以下逻辑:
teams = browser.find_elements_by_class_name("cartola-card-thin__nome__time")
你必须做什么?
teamsCount = len(teams);
teamIndexes = range(teamsCount)
for(i in temIndexes)
team = driver.find_element(locator_that_usesTeamIndex)