2016-08-30 35 views
0

現在,假設我的頁面有10個可點擊的同一類的鏈接,一個在另一個距離之下,這樣在當前視圖中只顯示前3個鏈接,其他鏈接在我向下滾動時顯示。現在,我寫了一個代碼來點擊所有這些代碼。它點擊前3,然後硒滾動我的頁面顯示鏈接5到7,頁面滾動太多,以免顯示鏈接4,因爲代碼試圖點擊鏈接4,這是不可見的,我的代碼給錯誤元素不可見。當頁面在硒中自動滾動時,爲什麼我的元素不在視圖中?

代碼:

def AddConnection(self): 
     mylist=self.driver.find_elements_by_xpath("//a[@class='primary-action-button label']") 
     for x in mylist: 
      x.click() 

完全錯誤:

================================== FAILURES =================================== 
_____________________________ test_add_connection _____________________________ 

driver = <selenium.webdriver.firefox.webdriver.WebDriver (session="3a05990c-13b 
-4418-baee-f0d54c611ff7")> 

>  add.AddConnection() 

test_add_connection.py:22: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
PageSearchResults.py:24: in AddConnection 
    x.click() 
c:\python27\lib\site-packages\selenium\webdriver\remote\webelement.py:73: in cl 
ck 
    self._execute(Command.CLICK_ELEMENT) 
c:\python27\lib\site-packages\selenium\webdriver\remote\webelement.py:456: in _ 
xecute 
    return self._parent.execute(command, params) 
c:\python27\lib\site-packages\selenium\webdriver\remote\webdriver.py:236: in ex 
cute 
    self.error_handler.check_response(response) 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x01E6ACB 
> 
response = {'status': 500, 'value': '{"name":"clickElement","sessionId":"3a0599 
c-13b8-4418-baee-f0d54c611ff7","status":13,"value...int (892.5, 12.199996948242 
88). Other element would receive the click: <div class=\"advanced-search-inner\ 
></div>"}'} 

    def check_response(self, response): 
     """ 
      Checks that a JSON response from the WebDriver does not have an err 
r. 

      :Args: 
      - response - The JSON response from the WebDriver server as a dict 
onary 
       object. 

      :Raises: If the response contains an error message. 
      """ 
     status = response.get('status', None) 
     if status is None or status == ErrorCode.SUCCESS: 
      return 

     value = None 
     message = response.get("message", "") 
     screen = response.get("screen", "") 
     stacktrace = None 
     if isinstance(status, int): 
      value_json = response.get('value', None) 
      if value_json and isinstance(value_json, basestring): 
       import json 
       try: 
        value = json.loads(value_json) 
        status = value.get('error', None) 
        if status is None: 
         status = value["status"] 
         message = value["value"] 
         if not isinstance(message, basestring): 
          value = message 
          try: 
           message = message['message'] 
          except TypeError: 
           message = None 
        else: 
         message = value.get('message', None) 
       except ValueError: 
        pass 

     exception_class = ErrorInResponseException 
     if status in ErrorCode.NO_SUCH_ELEMENT: 
      exception_class = NoSuchElementException 
     elif status in ErrorCode.NO_SUCH_FRAME: 
      exception_class = NoSuchFrameException 
     elif status in ErrorCode.NO_SUCH_WINDOW: 
      exception_class = NoSuchWindowException 
     elif status in ErrorCode.STALE_ELEMENT_REFERENCE: 
      exception_class = StaleElementReferenceException 
     elif status in ErrorCode.ELEMENT_NOT_VISIBLE: 
      exception_class = ElementNotVisibleException 
     elif status in ErrorCode.INVALID_ELEMENT_STATE: 
      exception_class = InvalidElementStateException 
     elif status in ErrorCode.INVALID_SELECTOR \ 
       or status in ErrorCode.INVALID_XPATH_SELECTOR \ 
       or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER: 
      exception_class = InvalidSelectorException 
     elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE: 
      exception_class = ElementNotSelectableException 
     elif status in ErrorCode.INVALID_COOKIE_DOMAIN: 
      exception_class = WebDriverException 
     elif status in ErrorCode.UNABLE_TO_SET_COOKIE: 
      exception_class = WebDriverException 
     elif status in ErrorCode.TIMEOUT: 
      exception_class = TimeoutException 
     elif status in ErrorCode.SCRIPT_TIMEOUT: 
      exception_class = TimeoutException 
     elif status in ErrorCode.UNKNOWN_ERROR: 
      exception_class = WebDriverException 
     elif status in ErrorCode.UNEXPECTED_ALERT_OPEN: 
      exception_class = UnexpectedAlertPresentException 
     elif status in ErrorCode.NO_ALERT_OPEN: 
      exception_class = NoAlertPresentException 
     elif status in ErrorCode.IME_NOT_AVAILABLE: 
      exception_class = ImeNotAvailableException 
     elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED: 
      exception_class = ImeActivationFailedException 
     elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS: 
      exception_class = MoveTargetOutOfBoundsException 
     else: 
      exception_class = WebDriverException 
     if value == '' or value is None: 
      value = response['value'] 
     if isinstance(value, basestring): 
      if exception_class == ErrorInResponseException: 
       raise exception_class(response, value) 
      raise exception_class(value) 
     if message == "" and 'message' in value: 
      message = value['message'] 

     screen = None 
     if 'screen' in value: 
      screen = value['screen'] 

     stacktrace = None 
     if 'stackTrace' in value and value['stackTrace']: 
      stacktrace = [] 
      try: 
       for frame in value['stackTrace']: 
        line = self._value_or_default(frame, 'lineNumber', '') 
        file = self._value_or_default(frame, 'fileName', '<anonymou 
>') 
        if line: 
         file = "%s:%s" % (file, line) 
        meth = self._value_or_default(frame, 'methodName', '<anonym 
us>') 
        if 'className' in frame: 
         meth = "%s.%s" % (frame['className'], meth) 
        msg = " at %s (%s)" 
        msg = msg % (meth, file) 
        stacktrace.append(msg) 
      except TypeError: 
       pass 
     if exception_class == ErrorInResponseException: 
      raise exception_class(response, message) 
     elif exception_class == UnexpectedAlertPresentException and 'alert' in 
alue: 
      raise exception_class(message, screen, stacktrace, value['alert'].g 
t('text')) 
>  raise exception_class(message, screen, stacktrace) 
E  WebDriverException: Message: Element is not clickable at point (892.5, 
2.199996948242188). Other element would receive the click: <div class="advanced 
search-inner"></div> 

c:\python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py:194: We 
DriverException 
========================== 1 failed in 40.13 seconds ========================== 
+0

我不認爲Selenium關心元素是否出現在可見窗口內容中。 「不可見」通常意味着雖然元素存在於html中,但它已被設計爲看起來不可見。 –

+0

剛剛發佈的錯誤追蹤具有錯誤「WebDriverException:消息:元素不可點擊」。這與您在帖子頂部提到的錯誤不同。你真的在問什麼? –

回答

1

想出解決方案,通過每一次點擊之後加入該代碼。

self.driver.execute_script("window.scrollBy(0, 150);") 
0

嘗試在調用x.click()之前調用x.location_once_scrolled_into_view。這應該會導致元素滾動到視圖中進行點擊。

相關問題