使用Python(Selenium)解决TimeoutException

问题描述 投票:0回答:1

对于一个小项目,我需要从以下网站提取破产公告:https://neu.insolvenzbekanntmacungen.de/ap/suche.jsf 输入今天的日期并从“Gegenstand der Veröffentlichung”的下拉菜单中选择“Eröffnungen”并单击底部的“搜索”后,我需要的是随后隐藏在页面缩放图标后面的文本。

我用来实现这个的Python代码如下:

import...

driver = webdriver.Safari()
driver.maximize_window()
driver.get("https://neu.insolvenzbekanntmachungen.de/ap/suche.jsf")

date_input = WebDriverWait(driver, 10).until(
    ec.visibility_of_element_located((By.ID, "frm_suche:ldi_datumVon:datumHtml5"))
)
curr_date = datetime.today().strftime("%Y-%m-%d")
arg_value = f"arguments[0].value = '{curr_date}';"
driver.execute_script("arguments[0].value = '';", date_input)
driver.execute_script(arg_value, date_input)

# Select the "Eröffnungen" option from the dropdown menu
select_element = WebDriverWait(driver, 20).until(
    ec.visibility_of_element_located((By.ID, "frm_suche:lsom_gegenstand:lsom"))
)
driver.execute_script("arguments[0].scrollIntoView(true);", select_element)
time.sleep(1)
select = Select(select_element)
select.select_by_value("2")

# Execute the search
driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", date_input)
date_input.send_keys(Keys.RETURN)

results_table = WebDriverWait(driver, 20).until(
    ec.visibility_of_element_located((By.ID, "tbl_ergebnis"))
)

rows = results_table.find_elements(By.TAG_NAME, "tr")
data = []

# Iterate over each row of the table
for i, row in enumerate(rows):
    cells = row.find_elements(By.TAG_NAME, "td")
    if len(cells) > 0:
        # Click the zoom icon to open the new window
        zoom_icon = cells[6].find_element(By.TAG_NAME, "input[type='image']")
        WebDriverWait(driver, 20).until(
            ec.element_to_be_clickable((By.TAG_NAME, "input[type='image']"))
        )
        driver.execute_script("arguments[0].scrollIntoView(true);", zoom_icon)
        time.sleep(1)  # Wait for scroll
        driver.execute_script("arguments[0].click();", zoom_icon)

        # Wait for the new window to open
        WebDriverWait(driver, 20).until(ec.new_window_is_opened)
        driver.switch_to.window(driver.window_handles[1])

        # Extract the publication text
        print("here")
        WebDriverWait(driver, 20).until(
            ec.presence_of_element_located((By.XPATH,
"//form[@id='form']//pre[@id='veroefftext']"))
        )
        print("here2")
        pub_text = driver.find_element(By.XPATH, "//form[@id='form']//pre[@id='veroefftext']").text

        # Close the new window and switch to the first window again
        driver.close()
        driver.switch_to.window(driver.window_handles[0])

        # Store the extracted data
        data.append({
            'veroeffentlichungsdatum': cells[0].text,
            'aktenzeichen': cells[1].text,
            'gericht': cells[2].text,
            'name_vorname_bezeichnung': cells[3].text,
            'sitz_wohnsitz': cells[4].text,
            'register': cells[5].text,
            'veroeffentlichungstext': pub_text
        })

df = pd.DataFrame(data)
df.columns = ['veroeffentlichungsdatum', 'aktuelles_aktenzeichen', 'gericht',
              'name_vorname_bezeichnung', 'sitz_wohnsitz', 'register', 'veroeffentlichungstext']
df.to_excel("data/insos.xlsx", index=False)

我对 Selnium 比较陌生,但我认为代码本身运行良好并且能够完成预期的任务。但是,对于两个打印语句之间的部分(print(here)、print(here2)),元素无法本地化的情况不断发生,并且我收到 TimeoutException。这似乎是随机发生的,因为有时有效,有时无效。我还已经进行了一次运行,能够完全提取所有缩放图标后面的文本。

难道标识符不唯一?我已经读过相关的帖子,大多数时候它建议使用我已经实现的 XPATH。我已经在相关帖子中建议的 print(here) 语句之后尝试了 driver.switch_to.default_content() 但仍然存在同样的问题。

非常感谢任何帮助我如何使其稳定,因为脚本应该每天执行。谢谢:)

python selenium-webdriver xpath timeoutexception
1个回答
0
投票

您明确等待它被定位,您自己说过有时它有效,有时它不起作用。你等待 20(毫秒或秒,我不知道)

根据您的描述,有时它的定位速度足够快,有时则不然。这意味着当元素有足够的时间来定位自身时,您必须调整等待参数并找到最佳解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.