xiaoxin 99 2024-12-02 16:18 采纳率: 0%
浏览 22

selenium实现自动化是出现重大bug:遍历数据的时候携带上一个用户报错数据进入下一个里面

我在使用selenium实现自动化的时候,出现了两个重大bug,
bug1:就是我在遍历表格数据的时候,在实现判断上次用户度数和这次水表度数进行判断的功能的时候, 用户A出现某些报错后,会自动跳到下一个用户B处,但是携带的上次用户度数的值还是用户A的,这是为什么呢,请教一下各位,这是部分代码,还有日志文件。
bug2:当用户A出现某些问题后,比如说延时了,然后我设置了如果当前用户有报错,会continue,跳过当前用户,进入到下一个用户,目的是不想因为这个耽误时间。但是实际中用的时候,发现如果用户A出现了问题,他的下一个用户都会全部出错,感觉就是把错误信息带到了下一个用户,以此类推,导致写的程序效果不好,这是为什么呢?请教一下各位

for index, row in dataframe.iterrows():
            user_id = row.get('署名') or row.get('客户编号') or row.get('用户编号')
            is_change = row['是否更换']
            old_base_code = row.get('拆表行度')
            new_quantity = row.get('新表表码')
            new_table_code = row.get('新表行度') or row.get('新表度数')
            this_handle_time = row['换表日期']
 
            # 获取符合条件的文件路径
            file_paths_list, file_paths = get_image_paths(user_id, folder_path)
 
            if len(file_paths_list) == 5 and is_change == '已更换':
                try:
                    logging.info(f"正在处理用户 {user_id} 的数据...")
                    ActionChains(driver).send_keys(Keys.F5).perform()
                    time.sleep(5)
 
                     WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.ID, 'af04599c-bd1b-420d-b5de-3f8d9e697294'))).click()
                    time.sleep(2)
 
                    input_element = driver.find_element(By.XPATH, "//div[contains(@class,'input-group f-state-editable')]/input")
                    input_element.clear()
                    input_element.send_keys(user_id)
                    input_element.send_keys(Keys.ENTER)
                    time.sleep(2)
 
                    # 检查单个任务中心是否存在
                    if is_element_present(driver, "//div[contains(@class, 'headLine')]"):
 
                        WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CLASS_NAME, "headLine"))).click()
 
                        time.sleep(5)
 
                        iframe = WebDriverWait(driver, 10).until(
                            EC.presence_of_element_located((By.XPATH, '//iframe[contains(@id, "rtf_iframe_WF0120")]'))
                        )
                        driver.switch_to.frame(iframe)
                        WebDriverWait(driver, 10).until(
                            EC.frame_to_be_available_and_switch_to_it(0)
                        )
  ############################问题在这个下面#################################################
                        # # 先对上次数据进行判断
                        lastime_input = None
                        lastime_input_element = None
                        chazhi = None
                        lastime_input_element = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//farris-number-spinner[@formcontrolname='lastStartNum']//input")))
                        lastime_input = lastime_input_element.get_attribute('value')
                        lastime_input = lastime_input.replace(',', '')
                        chazhi = int(old_base_code) - int(lastime_input)
                        logging.info(f"上次抄表行数为:{lastime_input}")
                        logging.info(f"旧表行度为:{old_base_code}")
                        logging.info(f"差值是:{chazhi}")
                        if chazhi < 0 or chazhi >= 200 or int(old_base_code) < 0:
                            driver.switch_to.default_content()
                            time.sleep(3)
                            WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, "//a[@title='任务中心']"))).click()
                            time.sleep(10)
                            # logging.info(f"用户 {user_id} 的数据有误,请检查!")
                            dataframe.at[index, '状态'] = '旧表行度为负数!不能小于上次抄表行数,不能比上次抄表行数大与等于200'
                            driver.get("https://portal.gzwatersupply.com/platform/runtime/sys/web/index.html#/main/taskcenter/task-main?funcId=WF0101&appType=menu&tabId=WF0101&cvft=eyJzZXNzaW9uSWQiOiJlNzQxMGNmZS1kM2FlLTQxNjctODNlOS00ZGFlMjBmNmU0ODAiLCJ1aWQiOiJBMDAwMjc4IiwidGFiSWQiOiJXRjAxMDEiLCJmdW5jSWQiOiJXRjAxMDEiLCJhcHBJZCI6bnVsbCwiYXBwRW50cmFuY2UiOm51bGwsImJvSWQiOiJUYXNrX015VGFzayIsIm1lbnVOYW1lIjoi5rWB56iL5Lit5b%2BDIn0%3D&appMode=spa&")
                            time.sleep(5)
                            ActionChains(driver).send_keys(Keys.F5).perform()
                            continue
      
                        # 单个任务中心 -> 附件管理按钮
                        # ma_element = driver.find_element(by=By.ID, value='toolBarItem_7768')
                        time.sleep(5)
 
                        ma_element = None
                        ma_element = WebDriverWait(driver, 15).until(
                            EC.element_to_be_clickable((By.XPATH, "//div[@id='header-nav']//f-response-toolbar//div[2]//div//button[1]"))
                        )
                        # ma_element = driver.find_element(By.XPATH, "")
                        ma_element.click()
                        time.sleep(15)
...
  • 写回答

1条回答 默认 最新

  • JavaPub-rodert 博客专家认证 2024-12-03 10:43
    关注

    本答案参考多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢。

    针对您提到的两个bug,这里提供一些可能的原因和解决方案:

    Bug 1:数据错乱问题

    问题描述:用户A的数据错误后,程序跳转到用户B,但携带了用户A的数据。

    可能原因:

    1. 变量作用域问题,导致数据没有及时清除或更新。
    2. 在异常处理中没有正确重置或更新变量。

    解决方案:

    • 确保在每次循环开始前,将所有相关变量重置为初始状态。
    • 使用局部变量而非全局变量,以减少数据错乱的风险。
    for index, row in dataframe.iterrows():
        # 重置变量
        user_id = None
        is_change = None
        old_base_code = None
        new_quantity = None
        new_table_code = None
        this_handle_time = None
    
        # 获取数据
        user_id = row.get('署名') or row.get('客户编号') or row.get('用户编号')
        is_change = row['是否更换']
        old_base_code = row.get('拆表行度')
        new_quantity = row.get('新表表码')
        new_table_code = row.get('新表行度') or row.get('新表度数')
        this_handle_time = row['换表日期']
    
        # 后续操作...
    

    Bug 2:错误信息传递问题

    问题描述:用户A出现问题后,后续所有用户都会出错。

    可能原因:

    1. 异常处理不当,导致错误状态没有被正确重置。
    2. 程序逻辑中存在依赖于前一个用户状态的变量,这些变量在异常发生时没有被重置。

    解决方案:

    • 在每个用户处理开始前,确保所有状态变量都被重置。
    • 使用try-except块来捕获并处理特定异常,确保异常处理后能够正确继续处理下一个用户。
    for index, row in dataframe.iterrows():
        try:
            # 用户处理逻辑...
        except Exception as e:
            logging.error(f"处理用户 {user_id} 时发生错误:{e}")
            dataframe.at[index, '状态'] = '处理出错'
            continue  # 跳过当前用户,继续下一个用户
        finally:
            # 清理或重置状态
            driver.switch_to.default_content()
            driver.get("https://portal.gzwatersupply.com/platform/runtime/sys/web/index.html#/main/taskcenter/task-main?funcId=WF0101&appType=menu&tabId=WF0101&cvft=eyJzZXNzaW9uSWQiOiJlNzQxMGNmZS1kM2FlLTQxNjctODNlOS00ZGFlMjBmNmU0ODAiLCJ1aWQiOiJBMDAwMjc4IiwidGFiSWQiOiJXRjAxMDEiLCJmdW5jSWQiOiJXRjAxMDEiLCJhcHBJZCI6bnVsbCwiYXBwRW50cmFuY2UiOm51bGwsImJvSWQiOiJUYXNrX015VGFzayIsIm1lbnVOYW1lIjoi5rWB56iL5Lit5b%2BDIn0%3D&appMode=spa&")
            ActionChains(driver).send_keys(Keys.F5).perform()
            time.sleep(5)
    

    确保在每个用户处理结束后,浏览器状态被重置,避免错误状态影响到下一个用户。希望这些解决方案能帮助您解决问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 12月2日
  • 创建了问题 12月2日

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)