写的代码有问题 求助大佬指点
本帖最后由 tianmenghuan 于 2024-4-12 09:12 编辑问题:代码执行之后,如果循环查找的元素不存在的情况下 浏览器自动关闭,程序停止了, except NoSuchElementException: 这一步就不执行,求助大佬from tkinter import Tk, Label, Entry, Button
import time
from threading import Thread
from selenium import webdriver
from selenium.webdriver.common.by import By
import pygame
from selenium.common.exceptions import NoSuchElementException
def run_code():
"""
执行具体的操作
"""
driver = webdriver.Chrome()
driver.get("https://www.douyin.com/user/self?showTab=post")
time.sleep(40)
def is_logged_in(driver):
# 尝试查找包含 "流年" 的元素
try:
element = driver.find_element(By.XPATH, "//span")
return True
except NoSuchElementException:
return False
while not is_logged_in(driver):
time.sleep(25)# 等待一段时间
for _ in range(int(entry2.get())):
try:
# 要查找的元素的 XPath
element_xpath = "//span"
element = driver.find_element(By.CSS_SELECTOR, ".tJjNB1rt.RUVRb0oR.RUCDqVRy")
value = element.text
print("元素的值:", value)
if int(value) > 0:
# 在窗口上显示信息
print("出现新的信息,开始执行警报")
# 初始化 pygame 的混音器
pygame.mixer.init()
# 加载声音文件
sound = pygame.mixer.Sound("D:/mp3/jingbao.wav")
# 播放声音
sound.play()
pygame.time.wait(2000)# 等待 2 秒
# 停止音乐
pygame.mixer.music.stop()
tk_label.config(text="注意有新的信息出现,请及时查看")
tk_label.after(10000, lambda: tk_label.config(text=""))
# 等待用户输入的间隔时间
time.sleep(int(entry1.get()))
except NoSuchElementException:
print("暂时没有新的消息,跳过")
tk_label.config(text="暂时没有新的消息,跳过")
tk_label.after(1000, lambda: tk_label.config(text=""))
continue
def thread_runner():
"""
在新线程中运行 run_code 函数
"""
Thread(target=run_code).start()
root = Tk()
root.title("应用程序")
root.geometry("250x110")# 设置窗口大小为 300x100
tk_label = Label(root, text="结果展示", width=30, bd=10, bg="yellow")
tk_label.pack(pady=3)
# 创建第一个输入框和其上方的文字标签
label1 = Label(root, text="间隔时间:")
label1.pack()
label1.place(x=0, y=50)
entry1 = Entry(root, width=8)
entry1.pack()
entry1.place(x=60, y=50)
# 创建第二个输入框和其上方的文字标签
label2 = Label(root, text="循环次数:")
label2.pack()
label2.place(x=0, y=80)
entry2 = Entry(root, width=8)
entry2.pack()
entry2.place(x=60, y=80)
button2 = Button(root, text="查询", width=5, command=thread_runner)
button2.pack(pady=10)
button2.place(x=195, y=60)
root.mainloop()
如果不是我的设备问题,我确实认为求助应该怎么让别人方便怎么来,你这我看着就是一行一行的黑色条纹,代码根本看不清楚,论坛可以贴代码的,建议试一下 HackYike 发表于 2024-4-2 20:49
如果不是我的设备问题,我确实认为求助应该怎么让别人方便怎么来,你这我看着就是一行一行的黑色条纹,代码 ...
他这是直接从IDE里面复制的,自带样式,都不调调,看着眼疼:sleepy: 你这个样式看着有点难受啊哥 从你的代码中,我注意到你的程序主要关注点在于使用Selenium进行网页自动化操作,并在特定条件下执行一系列动作。如果你遇到的问题是当循环中的元素找不到时,浏览器自动关闭并且 `except NoSuchElementException:` 块没有执行,那么可能有几个原因和解决方案:
1. **浏览器意外关闭问题**:如果浏览器在执行过程中意外关闭,那可能是由于代码中的某个部分引起的异常导致程序崩溃,而不仅仅是 `NoSuchElementException`。这种情况下,程序可能因为另外的异常而停止,导致没有执行到 `except NoSuchElementException:` 块。为了调试这个问题,你可以添加更多的异常处理来捕捉其他可能的异常,比如使用 `except Exception as e:` 并打印出异常信息。
2. **确保循环逻辑正确**:仔细检查你的循环逻辑,确保在找不到元素时循环可以正确地继续或者退出。如果循环依赖于找到特定元素才能继续,那么在找不到元素时循环可能会卡住或意外结束。
3. **改善异常处理**:你可以尝试将 `NoSuchElementException` 的处理放到更外层的循环中,或者添加一个更通用的异常处理来捕捉任何未预期的错误。
4. **使用显式等待**:在Selenium中使用 `time.sleep` 来等待页面加载或元素出现可能不够可靠。你可以考虑使用Selenium的显式等待(Explicit Wait),通过 `WebDriverWait` 配合 `expected_conditions` 来等待特定元素出现,这样可以提高程序的健壮性和响应性。
5. **检查元素定位器**:确保你的XPath或CSS选择器是正确的,并且在页面上实际上是存在的。有时页面结构的变化可能会导致之前工作的选择器失效。
这里是一个改进异常处理和使用显式等待的例子:
```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
# 用于等待的函数
def wait_for_element(driver, xpath, timeout=30):
try:
element = WebDriverWait(driver, timeout).until(
EC.presence_of_element_located((By.XPATH, xpath))
)
return element
except TimeoutException:
return None
# 在循环中使用
element = wait_for_element(driver, "//span")
if element:
# 元素找到,执行操作
pass
else:
# 元素未找到,处理情况
pass
```
通过上述方式,你可以更可靠地等待和检查元素,同时也能更好地处理异常情况。 HackYike 发表于 2024-4-2 20:49
如果不是我的设备问题,我确实认为求助应该怎么让别人方便怎么来,你这我看着就是一行一行的黑色条纹,代码 ...
抱歉,第一次发帖,发的时候直接复制粘贴的,你说的可以粘贴代码是点击添加代码那个按钮么 hy_cicada 发表于 2024-4-2 21:17
他这是直接从IDE里面复制的,自带样式,都不调调,看着眼疼
抱歉,第一次发帖,发的时候直接复制粘贴的,已经又编辑了一下等待审核 wlloveclass 发表于 2024-4-2 22:03
你这个样式看着有点难受啊哥
抱歉啊 ,第一次发帖 ,已经重新编辑了。 508 发表于 2024-4-3 01:39
从你的代码中,我注意到你的程序主要关注点在于使用Selenium进行网页自动化操作,并在特定条件下执行一系列 ...
感谢 感谢 我先试试去 没执行,眼看的。
推测报的错可能不是NoSuchElementException类型的错误。
您可以把NoSuchElementException去掉,即一旦报错,不管类型都返回False。试一下。
如果上述方法能解决,就应该是类型设置错了。再重新设为对应类型。
页:
[1]
2