xiaoxin 99 2024-11-30 23:52 采纳率: 0%
浏览 12

selenium实现自动化是出现重大bug:即使对页面重新刷新了还是会携带数据进入下一个里面

我在使用selenium实现自动化的时候,出现了一个bug,就是我在遍历表格数据的时候,在实现判断上次用户度数和这次水表度数进行判断的功能的时候, 用户A出现某些报错后,会自动跳到下一个用户B处,但是携带的上次用户度数的值还是用户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)

img

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码和日志来看,问题可能出现在处理多个用户数据时,未正确地切换到每个用户的独立环境中,而是保持了之前用户的状态信息,从而导致携带上一次的抄表行数不正确的问题。具体来说,你的代码中使用了全局的 driver 实例来处理多个用户的任务,而没有为每个用户创建一个独立的浏览器会话或环境。因此,在处理不同用户的数据时,上一次用户的抄表行数信息被保留并影响了当前用户的处理。解决这个问题的关键是确保每次处理一个用户数据时都在独立的浏览器环境中进行。一种可能的解决方案是使用 Selenium 的 detach() 方法创建一个新的浏览器窗口来处理每个用户的任务。下面是一个示例代码片段来展示如何解决这个问题:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common import action_chains
    
    # 创建 driver 实例并登录系统(这部分代码省略)
    # ...
    
    for index, row in dataframe.iterrows():
        user_id = ... # 获取用户信息,与你的代码一致
        # 创建新的浏览器窗口或标签页来处理当前用户的任务
        driver_window = driver.window_handles[0]  # 获取当前窗口句柄作为基准窗口句柄
        driver_window = driver.switch_to.window(driver_window)  # 确保在当前窗口中进行操作
        driver_window = driver.execute_script("return window;")  # 获取当前窗口的句柄
        driver_new_window = driver.switch_to.new_window('tab')  # 创建新的窗口或标签页处理当前用户的任务
        driver_new_window.get('目标网址')  # 这里是网站登录页面或者其他用户需要的网址,以替换实际用户的网页地址信息,以保证不同用户在各自的窗口中执行不同的任务。你的实际逻辑操作应该和此代码部分相结合调整并整合进去。这部分主要是为了模拟为每个用户创建新的会话环境进行操作。具体的处理逻辑你可以按照自己的实际需求来定制,比如在每个新的窗口处理过程中清理会话状态等。这样在每次循环中处理不同的用户数据时,就可以确保在一个独立的浏览器环境中进行,避免了上一次用户数据的影响。希望这个解决方案能够帮助你解决问题。如果还有其他问题或者需要进一步的帮助,请随时提问。
    
    评论

报告相同问题?

问题事件

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