2017-03-22 2 views
3

Selenium에 문제가있어 이해할 수 없습니다. 또한 Google을 통해이 문제에 대한 많은 정보를 찾을 수 없습니다. 페이스 북에셀레늄 WebDriverException : SubState가 정의되지 않은 InputState에 'id'마우스가 있어야 함. pointerMove

  1. 로그 :

    내 셀레늄 스크립트는 다음 단계를 수행합니다.

  2. 친구 제안 목록으로 이동하십시오.
  3. 몇 번 아래로 스크롤하여 (더 많은 제안을로드하려면)
  4. 콘솔에 모든 제안 사항을 하나씩 제시하고 사용자에게 친구 추가 여부를 묻습니다.

확인시 문제의 제안으로 이동 한 후 추가 버튼을 클릭하는 동작 체인이 만들어집니다.

하지만 액션 체인이 작동하지 않습니다.

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("[email protected]") 
    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 

나는 최신 셀레늄 버전을 사용하고 있습니다 :

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 

이 내 셀레늄 스크립트입니다 :

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

은 내가 파이어 폭스 52.0.1이 나는 다음과 같은 오류가 발생합니다 geckodriver v0.15.0.

업데이트 : 빠른 테스트 결과 동일한 스크립트가 Chrome Webdriver와 완벽하게 작동한다는 것이 밝혀졌습니다.

업데이트 2 : Github에서의 셀레늄 bugtracker에서이 문제 관련이 될 수도 있습니다 : https://github.com/SeleniumHQ/selenium/issues/3642

+0

이 오류가 발생한 정확한 위치를 가리 키십시오. –

+0

이 줄은 다음과 같습니다.'actions.move_to_element (friend_proposal) .move_to_element (friend_add_button) .perform()' – robert

답변

2

내가 오늘 같은 문제 다 퉜다. 첫 번째 move_to_element와 perform()가 작동하는 것을 관찰했을 것입니다. 적어도 내 경우에는 이것이 사실입니다. 이 작업을 반복하려면, 당신은 루프에 대한 귀하의 액션 체인을 다시 설정해야합니다 : - .perform을 통해 처음으로 실패 - 나를 위해

actions.perform()

actions.reset_actions()

+0

감사합니다.하지만 불행히도이 문제가 해결되지 않습니다. – robert

+0

perform() 호출 직후 어디에서 추가 했습니까? 두 번 확인했는데 정확하게 동일한 오류 메시지가 수정되었습니다. 내 시나리오는 다음과 같습니다 : actions.move_to_element(), actions.perform(), time.sleep (1), action.reset_actions(), 링크를 클릭 한 다음 (페이지 재로드 대기) 다시 시작하십시오. –

+0

+1 나를 도왔습니다. 원래는 단일 체인 '새로운 동작 (드라이버) .moveToElement (요소, 50, 20) .click(). perform().'에있었습니다. 새로운 액션 (드라이버) .moveToElement (inputSearchField, 50, 20) .perform(); 새로운 액션 (드라이버) .click(). perform();' –

0

내가 셀레늄 3.3.1에 오전, gecko 15와 최신 파이어 폭스는 자바를 사용합니다 - 동일한 코드가 크롬에서 완벽하게 작동합니다.