2016-08-30 31 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。这应该会导致元素滚动到视图中进行点击。

相关问题