是否可以通过使用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)
您当前的方法尝试在
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 块中。这将捕获与不存在的元素相关的异常,并允许您的代码做出相应的反应(例如,单击页面上的其他位置)。
请谨慎同时从多个线程访问共享资源,因为这可能会导致竞争条件。如有必要,请使用线程锁以避免此类问题。
希望有帮助。谢谢