如何防止陈旧的元素引用并使 WebElement 在 selenium 中自行更新?
How do I prevent a stale element reference and make a WebElement update itself in selenium?
我是处理 python 和 selenium 的完全新手,一周前才开始,所以请原谅我乱七八糟的代码。我正在尝试从 this website 中具有标签名称的元素中提取所有 '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()
os.remove('C:\Users\justs\Downloads\Ordered_svgs\slice'+str(number)+'\'+str(structure)+'.svg')
time.sleep(0.2)
text = open('C:\Users\justs\Downloads\Ordered_svgs\slice'+str(number)+'\'+str(structure)+'.svg','w+')
text.write(rep+str(structure)+'" d="'+str(d)+'"></path></svg>')
text.close()
print('File '+str(structure)+' modified in slice '+str(number)+'!')
else:
svg = open('C:\Users\justs\Downloads\Ordered_svgs\slice'+str(number)+'\'+str(structure)+'.svg','w+')
svg.write('<svg id="the_svg_wrapper" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"><path id="'+str(structure)+'" d="'+str(d)+'"></path></svg>')
svg.close()
print('File '+str(structure)+' made in slice '+str(number)+'!')
selected.send_keys('F')
paths = 0
print()
except Exception as e:
print('Error.')
print(e)
break
print('Done!')
driver.quit()
这对第一页工作正常,但我需要提取所有 106 页的路径,并且在按 'F' 一次(移动到下一页)后,我在第 structure = path.get_attribute('structure_id')
行。最初我认为路径需要一些时间来加载,因此 while 循环,但到第二页时它被永无止境的陈旧元素引用卡住了。
显式等待或刷新页面也不起作用,我怀疑 driver.find_element_by_class_name
WebElement 根本没有更新(当我进入下一页后刷新页面时,我提取的文件最终与第一页相同,无论如何我在第 5 页得到了一个陈旧的元素引用)。我该如何解决这个问题?感谢您的帮助!
您循环了 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
我是处理 python 和 selenium 的完全新手,一周前才开始,所以请原谅我乱七八糟的代码。我正在尝试从 this website 中具有标签名称的元素中提取所有 '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()
os.remove('C:\Users\justs\Downloads\Ordered_svgs\slice'+str(number)+'\'+str(structure)+'.svg')
time.sleep(0.2)
text = open('C:\Users\justs\Downloads\Ordered_svgs\slice'+str(number)+'\'+str(structure)+'.svg','w+')
text.write(rep+str(structure)+'" d="'+str(d)+'"></path></svg>')
text.close()
print('File '+str(structure)+' modified in slice '+str(number)+'!')
else:
svg = open('C:\Users\justs\Downloads\Ordered_svgs\slice'+str(number)+'\'+str(structure)+'.svg','w+')
svg.write('<svg id="the_svg_wrapper" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"><path id="'+str(structure)+'" d="'+str(d)+'"></path></svg>')
svg.close()
print('File '+str(structure)+' made in slice '+str(number)+'!')
selected.send_keys('F')
paths = 0
print()
except Exception as e:
print('Error.')
print(e)
break
print('Done!')
driver.quit()
这对第一页工作正常,但我需要提取所有 106 页的路径,并且在按 'F' 一次(移动到下一页)后,我在第 structure = path.get_attribute('structure_id')
行。最初我认为路径需要一些时间来加载,因此 while 循环,但到第二页时它被永无止境的陈旧元素引用卡住了。
显式等待或刷新页面也不起作用,我怀疑 driver.find_element_by_class_name
WebElement 根本没有更新(当我进入下一页后刷新页面时,我提取的文件最终与第一页相同,无论如何我在第 5 页得到了一个陈旧的元素引用)。我该如何解决这个问题?感谢您的帮助!
您循环了 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