因此,我有多个动态框架,这些框架的名称根据所单击的元素而有所不同。我已经尝试过使用try
这样的语句:
try:
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='ui-id-1']/iframe"))
except:
try:
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='ui-id-4']/iframe"))
except:
try:
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='ui-id-7']/iframe"))
except:
print("Failed to find a frame")
但是,一旦我越过第一帧,就永远找不到第二帧(在本例中为id-4)。
我也尝试过使用src查找帧:
element = driver.find_element_by_css_selector('[src*="text-within-frame"]')
driver.switch_to.frame(element)
我做错了什么/我应该做些什么?
编辑:
好吧,所以当我运行程序时,它将始终到达第一帧,访问并刮擦我需要的所有数据,然后在尝试移至下一帧区域进行刮擦时失败。我认为问题在于,一旦第1帧存在,即使它不再存在,它也总是找到第1帧,而我需要的新数据在第2帧上(在我的情况下为id-4)。有没有一种方法可以让我的代码在使用第1帧后就不理会?
这里以非代码准确的方式解释了我的需求,希望可以帮助更好地解释。:
Switch to Frame 1
if Frame 1 already used:
Switch to Frame 2
if Frame 2 already used:
Switch to Frame 3
答案 0 :(得分:0)
是否可以循环运行?
xpath = ["//*[@id='ui-id-1']/iframe", "//*[@id='ui-id-4']/iframe", "//*[@id='ui-id-7']/iframe"]
for i in xpath:
try:
driver.switch_to.frame(driver.find_element_by_xpath(i)
except:
print("failed to find a frame")
答案 1 :(得分:0)
try:
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='ui-id-7']/iframe"))
except:
try:
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='ui-id-4']/iframe"))
except:
try:
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='ui-id-1']/iframe"))
except:
print("Couldn't find frame")
我需要反转程序搜索帧的顺序,因为原始帧ui-id-1在首次使用后始终可用。因此,当我尝试移至下一帧时,我总是会找到ui-id-1,然后返回异常。想我应该张贴,以防有人遇到类似问题。