为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止过时的元素引用并使 WebElement 在 selenium 中自我更新?

如何防止过时的元素引用并使 WebElement 在 selenium 中自我更新?

慕后森 2023-10-26 10:47:36
我是一个处理 python 和 selenium 的新手,一周前才开始,所以请原谅我乱七八糟的代码。我试图从该网站中带有标签名称的元素中提取所有“structure_id”和“d”信息,并将它们存储在单独的 svg 文件中。这是我遇到问题的代码片段:for number in range(1,106):    try:        element = WebDriverWait(driver, 10).until(            EC.presence_of_all_elements_located((By.ID, 'master_group'))        )        selected = driver.find_element_by_class_name('simstripImgSel')        driver.get(driver.current_url)        paths = driver.find_elements_by_tag_name('path')                for path in paths:            while True:                try:                    structure = path.get_attribute('structure_id')                    d = path.get_attribute('d')                    break                except Exception as e:                    print(e)                    paths = driver.find_elements_by_tag_name('path')                    continue            if structure != None:                print('Attributes copied.')                for word, initial in data.items():                    structure = structure.replace(word,initial)                filepath = Path('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg')                if filepath.is_file():                    text = open('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg','r+')                    rep = text.read()                    rep = rep.replace('</svg>','<path id="')                    text.close()这对于第一页效果很好,但我需要提取所有 106 页的路径,并且在按一次“F”后(移动到下一页),我在 行 处获得了陈旧的元素引用structure = path.get_attribute('structure_id')。最初,我认为路径需要一些时间来加载,因此需要 while 循环,但到了第二页,它就陷入了永无休止的陈旧元素引用。显式等待或刷新页面也不起作用,我怀疑 WebElementdriver.find_element_by_class_name根本没有更新(当我进入下一页后刷新页面时,我提取的文件最终与第一页相同,无论如何,我在第 5 页得到了陈旧的元素引用)。我该如何解决这个问题?任何帮助表示赞赏!
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您循环了该 url,因此它转到了第 1 页。


driver.get('http://atlas.brain-map.org/atlas?atlas=265297126#atlas=265297126&plate=102339919&structure=10155&x=42480&y=16378&zoom=-7&resolution=124.49&z=2')

for i in range(1,106):

    try:

        paths=WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.TAG_NAME, "path")))   

        for path in paths:

            structure = path.get_attribute('structure_id')

            d = path.get_attribute('d')

        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "simstripImgSel"))).send_keys("F")

        time.sleep(0.5)

    except Exception as e:

        print(e)

进口


from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait 

from selenium.webdriver.support import expected_conditions as EC


查看完整回答
反对 回复 2023-10-26
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信