吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 678|回复: 11
收起左侧

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

[复制链接]
tianmenghuan 发表于 2024-4-2 16:38
本帖最后由 tianmenghuan 于 2024-4-12 09:12 编辑

问题:代码执行之后,如果循环查找的元素不存在的情况下 浏览器自动关闭,程序停止了, except NoSuchElementException: 这一步就不执行,求助大佬
[Python] 纯文本查看 复制代码
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[contains(text(), '流年')]")
            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[contains(text(), '流年')]"


            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里面复制的,自带样式,都不调调,看着眼疼
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[contains(text(), '流年')]")
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。试一下。
如果上述方法能解决,就应该是类型设置错了。再重新设为对应类型。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 20:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表