Selenium WebDriverException : Expected 'id' mouse to be mapped to InputState whose subtype is undefined, 得到:pointerMove

标签 selenium selenium-webdriver selenium-firefoxdriver

我对 Selenium 有一个无法理解的问题。另外,我无法通过 Google 找到有关此问题的大量信息。

我的 Selenium 脚本执行以下步骤:

  1. 登录 Facebook。
  2. 转到好友推荐列表。
  3. 向下滚动几次(以加载更多提案)。
  4. 将所有提议一一呈现在控制台上,询问用户是否要加好友。

确认后,将创建一个移动到相关提案的操作链,然后单击添加按钮。

但是Action链不起作用。我收到以下错误:

Potential friend name: 'John Doe'
Social context: 'Max Mustermann und 3 weitere gemeinsame Freunde'
Traceback (most recent call last):
  File "c:\...\facebook_selenium_minimal.py", line 74, in <module>
    main()
  File "c:\...\facebook_selenium_minimal.py", line 57, in main
    friend_add_button).perform()
  File "C:\Python36\lib\site-packages\selenium\webdriver\common\action_chains.py", line 77, in perform
    self.w3c_actions.perform()
  File "C:\Python36\lib\site-packages\selenium\webdriver\common\actions\action_builder.py", line 76, in perform
    self.driver.execute(Command.W3C_ACTIONS, enc)
  File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 238, in execute
    self.error_handler.check_response(response)
  File "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 193, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Expected 'id' mouse to be mapped to InputState whose subtype is undefined, got: pointerMove

这是我的 Selenium 脚本:

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait  # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC  # available since 2.26.0
from selenium.webdriver.common.action_chains import ActionChains

TIMEOUT = 5

def main():
    driver = webdriver.Firefox()
    driver.get("http://www.facebook.com")

    print(driver.title)

    input_mail = driver.find_element_by_id("email")
    input_password = driver.find_element_by_id("pass")

    input_mail.send_keys("your_login@example.com")
    input_password.send_keys("your_password")
    input_password.submit()

    try:
        WebDriverWait(driver, TIMEOUT).until(
            EC.visibility_of_element_located((By.NAME, "requests")))

        driver.get("https://www.facebook.com/friends/requests/?fcref=jwl")

        WebDriverWait(driver, TIMEOUT).until(
            EC.visibility_of_element_located((By.ID, "fbSearchResultsBox")))

        # Let Facebook load more friend proposals.
        for i in range(2):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
            time.sleep(1.0)

        friend_proposals = driver.find_elements_by_class_name(
            "friendBrowserListUnit")

        for friend_proposal in friend_proposals:
            try:
                friend_title = friend_proposal.find_element_by_class_name(
                    "friendBrowserNameTitle")
            except NoSuchElementException:
                print("Title element could not be found. Skipping.")
                continue

            print("Potential friend name: '%s'" % friend_title.text)

            social_context = friend_proposal.find_element_by_class_name(
                "friendBrowserSocialContext")
            social_context_text = social_context.text
            print("Social context: '%s'" % social_context_text)

            friend_add_button = friend_proposal.find_element_by_class_name(
                "FriendRequestAdd")

            actions = ActionChains(driver)
            actions.move_to_element(friend_proposal).move_to_element(
                friend_add_button).perform()
            time.sleep(0.1)

            print("Should I add the friend (y/N): ")
            response = input()
            if response == "y":
                friend_add_button.click()
                time.sleep(1.0)
                print("Added friend...")

    except TimeoutException as exc:
        print("TimeoutException: " + str(exc))
    finally:
        driver.quit()

if __name__ == '__main__':
    try:
        main()
    except:
        raise

我正在使用最新的 Selenium 版本:

C:\Users\Robert>pip show selenium
Name: selenium
Version: 3.3.1

我有 Firefox 52.0.1 和 geckodriver v0.15.0。

更新:一项快速测试表明,同一脚本可以与 Chrome Webdriver 完美配合。

更新 2:Github 上的 Selenium bugtracker 中的这个问题可能与此相关:https://github.com/SeleniumHQ/selenium/issues/3642

最佳答案

我今天遇到了同样的问题。您可能已经观察到第一个 move_to_element 和 perform() 起作用了——至少在我的例子中是这样。要重复此操作,您应该在 for 循环中重置操作链:

actions.perform()

actions.reset_actions()

关于Selenium WebDriverException : Expected 'id' mouse to be mapped to InputState whose subtype is undefined, 得到:pointerMove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42949950/

相关文章:

java - 如何在测试自动化中处理 Firefox 浏览器确认消息?

java - jacoco agent on wildfly - 0% 覆盖类(class)

java - org.openqa.selenium.ElementNotVisibleException : Element is not currently visible while clicking a checkbox through SeleniumWebDriver and Java

java - 如何单击 Selenium Webdriver 中的链接

java - Selenium(JAVA) 网格仅在 Windows 中同时启动 10 个浏览器

python - 如何在Python中获取geckodriver的绝对路径

selenium - 如何使用selenium在不同的应用程序中重用相同的WebDriver

javascript - 计数()与 Protractor 中的长度

java - Selenium Chromedriver : Unable to find an exact match for CDP version 98, 所以返回找到的最接近的版本:97

java - SendKeys 导致 "Leav page"警报