对框架进行排序时使用try语句

时间:2019-07-19 14:37:57

标签: python selenium

因此,我有多个动态框架,这些框架的名称根据所单击的元素而有所不同。我已经尝试过使用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

2 个答案:

答案 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,然后返回异常。想我应该张贴,以防有人遇到类似问题。