歌者文明清理员 发表于 2023-5-20 13:29:27

selenium点击这个元素

本帖最后由 歌者文明清理员 于 2023-5-20 13:32 编辑

如题,,,死活不能点到
<button class="transition text-neutral-300 hover:text-neutral-800 dark:hover:text-neutral-200"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class=" iconify iconify--ri" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 3c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2Zm0 14c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2Zm0-7c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2Z"></path></svg></button>

isdkz 发表于 2023-5-20 13:29:55

您好,这个问题可能是由于以下原因导致的:

1. 元素未加载:如果元素未加载完成,尝试等待一段时间再尝试点击。

2. 元素被其他元素遮挡:如果元素被其他元素遮挡,可以尝试使用Selenium的ActionChains类来模拟鼠标移动到元素上并点击。

3. 元素不可点击:如果元素被设置为不可点击,可以尝试使用JavaScript来模拟点击。

下面是一个示例代码,它使用了ActionChains类来点击元素:

from selenium.webdriver import ActionChains

element = driver.find_element_by_id("element_id")
actions = ActionChains(driver)
actions.move_to_element(element).click().perform()

希望这可以帮助您解决问题。

歌者文明清理员 发表于 2023-5-20 13:31:38

isdkz 发表于 2023-5-20 13:29
您好,这个问题可能是由于以下原因导致的:

1. 元素未加载:如果元素未加载完成,尝试等待一段时间再尝试 ...

E:\Python\e\venv\Scripts\python.exe E:\python\e\main.py
Traceback (most recent call last):
File "E:\python\e\main.py", line 10, in <module>
    answer = ai.ask(question)
File "E:\python\e\gpt.py", line 39, in ask
    ActionChains(self.driver).move_to_element(self.driver.find_element(
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 831, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
File "D:\Python\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified
(Session info: chrome=113.0.5672.127)
Stacktrace:
Backtrace:
        GetHandleVerifier
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        GetHandleVerifier
        GetHandleVerifier
        GetHandleVerifier
        GetHandleVerifier
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        BaseThreadInitThunk
        RtlGetAppContainerNamedObjectPath
        RtlGetAppContainerNamedObjectPath


进程已结束,退出代码1

<button class="transition text-neutral-300 hover:text-neutral-800 dark:hover:text-neutral-200"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class=" iconify iconify--ri" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 3c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2Zm0 14c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2Zm0-7c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2Z"></path></svg></button>

isdkz 发表于 2023-5-20 13:38:09

歌者文明清理员 发表于 2023-5-20 13:31


看起来应该是你的选择器的语法错了

歌者文明清理员 发表于 2023-5-20 13:38:25

isdkz 发表于 2023-5-20 13:38
看起来应该是你的选择器的语法错了

那正确的选择器语法应该是?

isdkz 发表于 2023-5-20 13:39:33

歌者文明清理员 发表于 2023-5-20 13:38
那应该是?

ActionChains(self.driver).move_to_element(self.driver.find_element(这一句后面是怎么写的?

歌者文明清理员 发表于 2023-5-20 13:40:45

本帖最后由 歌者文明清理员 于 2023-5-20 13:50 编辑

isdkz 发表于 2023-5-20 13:39
ActionChains(self.driver).move_to_element(self.driver.find_element(这一句后面是怎么写的?

ActionChains(self.driver).move_to_element(self.driver.find_element(
            By.CLASS_NAME, " iconify iconify--ri"
      )).click().perform()

isdkz 发表于 2023-5-20 13:49:50

歌者文明清理员 发表于 2023-5-20 13:40


你传递给find_element方法的选择器是无效的。你正在试图用By.CLASS_NAME去查找一个元素,它的类名为"iconify iconify--ri" 。

By.CLASS_NAME只能用于单一的类名,不能用于包含空格的类名,因为在 HTML 中,一个元素可以有多个类名,类名之间用空格分隔。所以,当你尝试使用包含空格的字符串作为类名选择器时,Selenium 会认为这是一个无效的选择器。

如果你想要选择的元素有多个类名,你应该使用 CSS 选择器或 XPath。以下是一些例子:

· CSS 选择器: By.CSS_SELECTOR, ".iconify.iconify--ri"
· XPath: By.XPATH, "//*[@class='iconify iconify--ri']"

以上选择器将定位到具有 "iconify" 和 "iconify--ri" 两个类名的元素。请注意 CSS 选择器中的.在类名前面,和类名之间没有空格,这是因为在 CSS 选择器中,空格有特殊的含义。在 XPath 中, @class是用来选择具有特定类属性的元素的。

歌者文明清理员 发表于 2023-5-20 13:51:34

本帖最后由 歌者文明清理员 于 2023-5-20 13:53 编辑

isdkz 发表于 2023-5-20 13:49
你传递给find_element方法的选择器是无效的。你正在试图用By.CLASS_NAME去查找一个元素,它的类 ...

没报错,可是没效果

isdkz 发表于 2023-5-20 13:53:11

歌者文明清理员 发表于 2023-5-20 13:51
没报错,可是没效果

报错了呀


歌者文明清理员 发表于 2023-5-20 13:53:47

isdkz 发表于 2023-5-20 13:53
报错了呀

你也用snipaste?

我是说By.XPATH, "//*[@class='iconify iconify--ri']"没报错没效果

isdkz 发表于 2023-5-20 13:57:16

本帖最后由 isdkz 于 2023-5-20 13:59 编辑

歌者文明清理员 发表于 2023-5-20 13:53
你也用snipaste?

我是说没报错没效果

从哪里看出来是 snipaste?

歌者文明清理员 发表于 2023-5-20 13:58:35

isdkz 发表于 2023-5-20 13:57
从哪里看出来是 snipaste?

从哪里看出来是 snipaste?文件名
你那个报错就是这一句引发的呀
我是说,8#里你的代码没报错但是也没效果

isdkz 发表于 2023-5-20 13:59:59

歌者文明清理员 发表于 2023-5-20 13:58
文件名

我是说,8#里你的代码没报错但是也没效果

没报错应该是找到元素了,找不到也会报错的

歌者文明清理员 发表于 2023-5-20 14:03:41

d=6239230&ptid=228526]isdkz 发表于 2023-5-20 13:59
没报错应该是找到元素了,找不到也会报错的

8#找到了元素但没效果
ActionChains(self.driver).move_to_element(self.driver.find_element(
            By.XPATH, "//*[@class='iconify iconify--ri']"
      )).perform()

isdkz 发表于 2023-5-20 14:17:48

歌者文明清理员 发表于 2023-5-20 14:03
8#找到了元素但没效果

你的代码移动到了指定元素,但是并没有包含一个click()操作。 perform()方法只是执行这个链中的所有操作,如果链中没有click()操作,那么就不会有点击动作发生。

你的代码应该如下:

ActionChains(self.driver).move_to_element(self.driver.find_element(
    By.XPATH, "//*[@class='iconify iconify--ri']"
)).click().perform()


这段代码将会把鼠标移动到指定元素,并且点击这个元素。

如果你的代码还是没有效果,那么可能有以下几个原因:

1. 你想要的元素可能被其他元素遮挡。在这种情况下,Selenium 可能无法进行点击。你可以检查一下你的元素是否被其他元素遮挡。

2. 你的元素可能需要时间来加载。如果你在元素完全加载前就尝试点击,那么可能没有效果。你可以使用 WebDriverWait 来等待元素完全加载。

3. 你的元素可能在一个 iframe 中。如果你的元素在一个 iframe 中,那么你需要先切换到这个 iframe,然后再进行操作。

请检查一下这些可能的问题,如果还有问题,欢迎继续提问。

歌者文明清理员 发表于 2023-5-20 14:21:10

isdkz 发表于 2023-5-20 14:17
你的代码移动到了指定元素,但是并没有包含一个click()操作。 perform()方法只是执行这个链中的所 ...

和刚才一样
程序没有退出,预期在你的代码后面还有操作,可没有执行,当手动关闭窗口时,程序提示你的代码报错,说找不到窗口
E:\Python\e\venv\Scripts\python.exe E:\python\e\main.py
Traceback (most recent call last):
File "E:\python\e\main.py", line 13, in <module>
    answer = ai.ask(question)
File "E:\python\e\gpt.py", line 39, in ask
    ActionChains(self.driver).move_to_element(self.driver.find_element(
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 831, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
File "D:\Python\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: disconnected: unable to send message to renderer
(failed to check if window was closed: disconnected: not connected to DevTools)
(Session info: chrome=113.0.5672.127)
Stacktrace:
Backtrace:
        GetHandleVerifier
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        GetHandleVerifier
        GetHandleVerifier
        GetHandleVerifier
        GetHandleVerifier
        (No symbol)
        (No symbol)
        (No symbol)
        (No symbol)
        BaseThreadInitThunk
        RtlGetAppContainerNamedObjectPath
        RtlGetAppContainerNamedObjectPath


进程已结束,退出代码1

isdkz 发表于 2023-5-20 14:29:56

歌者文明清理员 发表于 2023-5-20 14:21
和刚才一样
程序没有退出,预期在你的代码后面还有操作,可没有执行,当手动关闭窗口时,程序提示你的代 ...

从你给出的错误信息看,错误类型是selenium.common.exceptions.WebDriverException ,并且错误信息是 "disconnected: unable to send message to renderer",这说明 WebDriver 和浏览器之间的连接被中断了。而且你提到,当手动关闭窗口时,程序提示你的代码报错,说找不到窗口,这进一步确认了连接已经被中断。

这个问题可能的原因如下:

1. 你的 Selenium 会话可能在你的代码还在运行的时候被意外关闭了。你提到你手动关闭了窗口,这就可能是原因。当你关闭浏览器窗口或者标签页时,与之相关的 WebDriver 会话也会被关闭。

2. 浏览器崩溃或者被系统强制关闭。例如,有一些系统级的清理工具可能会强制关闭一些应用来释放系统资源。

3. Selenium 与浏览器的兼容性问题。确保你的 Selenium 和浏览器(Chrome)的版本匹配。如果版本不匹配,可能会导致一些未预期的问题。

为了解决这个问题,你可以试试以下几种方法:

1. 不要在你的代码还在运行的时候手动关闭浏览器窗口或者标签页。

2. 确保你的系统没有在你的代码运行的时候强制关闭浏览器。

3. 检查你的 Selenium 和浏览器的版本,确保它们匹配。如果你的 Chrome 是最新版的,那么你应该使用最新版的 Selenium。如果问题依然存在,你可以尝试使用旧一点的浏览器和 Selenium 版本,看是否有帮助。

如果问题依然存在,你可能需要提供更多的信息,以便更好地解决问题。
页: [1]
查看完整版本: selenium点击这个元素