Selenium Python 如何在具有多个 def 的循环上运行 XPath 错误处理异常?

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

是否可以通过使用schedule.every(10).seconds.do(example)或类似的命令来运行我的代码来安排它?我正在尝试在我的代码(XPath)中安排错误处理部分,该部分与 While 循环一起使用,尽管因为它在 While 循环中,它拒绝运行其他 def 函数,但我希望 XPath/错误处理部分在使用我的 Selenium 窗口循环,但检测而不干扰其他 def 函数。它应该只检测 XPath 是否存在,然后如果没有检测到则运行异常..有人有解决方案吗?

我的代码:

def example():
    options = Options()
    options.add_experimental_option("detach", True)

    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),
                              options=options)

    driver.get("example.com")
    driver.set_window_position(0, 0)
    driver.set_window_size(750, 512)

    while True:
        e = driver.find_elements(By.XPATH,"/html/body/div/div/div/div/div[2]/div/div/div[2]/div[2]/div[1]/span/button/span")
        if not e:
            print("Element not found")
            pyautogui.moveTo(89, 56)
            time.sleep(1)
            pyautogui.click()

        time.sleep(10)


def example2():
    options = Options()
    options.add_experimental_option("detach", True)

    driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))

    driver.get("example.com")
    driver.set_window_position(750, 0)
    driver.set_window_size(750, 512)

    while True:
        e = driver.find_elements(By.XPATH,"/html/body/div/div/div/div/div[2]/div/div/div[2]/div[2]/div[1]/span/button/span")
        if not e:
            print("Element not found")
            pyautogui.moveTo(850, 57)
            time.sleep(1)
            pyautogui.click()

schedule.every().day.at("22:59").do(example)
schedule.every().day.at("22:59").do(example2)

while True:
    schedule.run_pending()
    time.sleep(1)


python selenium-webdriver selenium-chromedriver
1个回答
0
投票

您当前的方法尝试在

while True
example
函数中使用阻塞
example2
循环,该循环通过 XPath 不断检查元素是否存在。这确实会阻止任何其他代码执行,包括计划任务,因为 Python 的默认执行模型是单线程的。如果代码的一部分处于无限循环或长时间运行的操作中,它会有效地冻结其他所有内容。

我的建议是,您应该使用 Python 的

threading
库在单独的线程中运行阻塞循环。这允许您的主程序继续运行并执行其他计划任务,而不会被
example
example2
中的无限循环阻塞。

import threading
import schedule
import time
# Import other necessary modules like Selenium, pyautogui, etc.

def example():
    # Your existing code for example function

def example2():
    # Your existing code for example2 function

# Schedule tasks as before
schedule.every().day.at("22:59").do(example)
schedule.every().day.at("22:59").do(example2)

# Run the example functions in their threads
example_thread = threading.Thread(target=example)
example2_thread = threading.Thread(target=example2)

example_thread.start()
example2_thread.start()

# Run the scheduler in the main thread
while True:
    schedule.run_pending()
    time.sleep(1)

您可以使用另一种方法。不要在

while True
example
函数中使用
example2
循环,而是考虑重构代码以按计划的时间间隔检查元素。这可以直接使用
schedule
库通过调度检查本身来完成,而不是将其置于无限循环中。

例如,您可以创建一个专门用于检查元素是否存在的函数,然后安排该函数与其他任务一起每 10 秒左右运行一次。这避免了阻塞循环的需要,并允许调度程序在检查发生时进行管理。

为了处理诸如未找到元素之类的异常(这似乎是您最关心的问题),请确保将代码的相关部分包装在 try-except 块中。这将捕获与不存在的元素相关的异常,并允许您的代码做出相应的反应(例如,单击页面上的其他位置)。

请谨慎同时从多个线程访问共享资源,因为这可能会导致竞争条件。如有必要,请使用线程锁以避免此类问题。

希望有帮助。谢谢

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