tianmenghuan 发表于 2024-4-2 16:38

写的代码有问题 求助大佬指点

本帖最后由 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

如果不是我的设备问题,我确实认为求助应该怎么让别人方便怎么来,你这我看着就是一行一行的黑色条纹,代码根本看不清楚,论坛可以贴代码的,建议试一下

hy_cicada 发表于 2024-4-2 21:17

HackYike 发表于 2024-4-2 20:49
如果不是我的设备问题,我确实认为求助应该怎么让别人方便怎么来,你这我看着就是一行一行的黑色条纹,代码 ...

他这是直接从IDE里面复制的,自带样式,都不调调,看着眼疼:sleepy:

wlloveclass 发表于 2024-4-2 22:03

你这个样式看着有点难受啊哥

508 发表于 2024-4-3 01:39

从你的代码中,我注意到你的程序主要关注点在于使用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
```

通过上述方式,你可以更可靠地等待和检查元素,同时也能更好地处理异常情况。

tianmenghuan 发表于 2024-4-3 09:15

HackYike 发表于 2024-4-2 20:49
如果不是我的设备问题,我确实认为求助应该怎么让别人方便怎么来,你这我看着就是一行一行的黑色条纹,代码 ...

抱歉,第一次发帖,发的时候直接复制粘贴的,你说的可以粘贴代码是点击添加代码那个按钮么

tianmenghuan 发表于 2024-4-3 09:16

hy_cicada 发表于 2024-4-2 21:17
他这是直接从IDE里面复制的,自带样式,都不调调,看着眼疼

抱歉,第一次发帖,发的时候直接复制粘贴的,已经又编辑了一下等待审核

tianmenghuan 发表于 2024-4-3 09:19

wlloveclass 发表于 2024-4-2 22:03
你这个样式看着有点难受啊哥

抱歉啊 ,第一次发帖 ,已经重新编辑了。

tianmenghuan 发表于 2024-4-3 09:20

508 发表于 2024-4-3 01:39
从你的代码中,我注意到你的程序主要关注点在于使用Selenium进行网页自动化操作,并在特定条件下执行一系列 ...

感谢 感谢 我先试试去

夜雨微澜 发表于 2024-4-4 22:28

没执行,眼看的。
推测报的错可能不是NoSuchElementException类型的错误。
您可以把NoSuchElementException去掉,即一旦报错,不管类型都返回False。试一下。
如果上述方法能解决,就应该是类型设置错了。再重新设为对应类型。
页: [1] 2
查看完整版本: 写的代码有问题 求助大佬指点