如何通过列表处理脚本期间如何处理页面自动更新

问题描述 投票:0回答:1

我有一个贯穿页面的Python / Selenium脚本,为了不向服务器发送垃圾邮件,我在与页面元素进行交互之间有半秒的睡眠时间。我注意到一个脚本在列表中“丢失跟踪”项目的问题,最近才发现这似乎是由于脚本运行期间页面自动更新/重置引起的。 ID似乎是动态生成的,因此刷新通常会更改某些ID,并且脚本会崩溃。

[当我第一次遇到该问题时,我只是对其进行了尝试捕获,跳过了它未能跟踪的元素并记录了错误,因为我没有关于此问题的任何真实信息,而且很少见。

花了一些心思,并观看了一段时间的脚本,我发现稍有刷新,页面重新排列了一些元素。

我想出的最好的主意是在下面,我在其中完全重新加载页面并刷新列表MID-LOOP并重新开始。这显然是解决此问题的错误方法。有什么更好的选择?

        try:
            browser.execute_script("arguments[0].click();", button)
        except link_lost:
            print('Lost track of something...')
            browser.refresh() # Page glitch fix. Refresh, relocate buttons, start over.
            browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(5) # could be optimized by keeping track of which question we're on and starting from there
            target_buttons = browser.find_elements_by_css_selector('[aria-label=target]')
python selenium
1个回答
0
投票

您可以使用硒功能轻松完成此操作:

  1. 找到列表的父元素,然后转到要单击的第一个元素
  2. 使用要单击的xpath查找元素,将其另存为变量

示例:

add_button = driver.find_elements_by_xpath('//button[contains(text(), "Dodaj")]')
contact_field = add_button[0].find_elements_by_xpath('.//parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*/parent::*')
name_of_contact = contact_field[0].find_element_by_xpath('.//div/div/div/div/div/a')
  1. 例如,name_of_contact是您的变量,contact_field是诸如列表或窗口之类的父元素。
  2. 现在只需使用contact_field [0] .click(),无论发生什么情况,它始终是该列表中的第一个元素。
© www.soinside.com 2019 - 2024. All rights reserved.