JavaScript定位到了但执行脚本时仍提示为抓取到

点前


点后

image

都已经找到元素了,但还定位不到

定位不到需要具体分析下,你可以先加死等看下能不能定位到,如果可以定位到,那说明可以使用显式等待替代

你报错好好的贴下,报错信息都被你隐藏掉了,不要用截图。直接把错误复制出来就好了。

从那个ElementNotInterfactable错误来看,那个控件是可以被定位到,只是当时不可被点击。理论上是加个显式等待控件可被点击就行了。

这个下拉框把鼠标悬浮过去,然后才能点击把,不悬浮应该状态是不能点的

不加等待是报这个

…\TrustZ_project1\testcase\test_create_controlled_property.py::TestCreateControlledProperty::test_create_controlled_property 2022-08-28 17:43:46,309|INFO|访问登录
FAILED [100%]2022-08-28 17:43:47,555|INFO|点击展开
2022-08-28 17:43:48,200|INFO|点击受控资产库菜单
2022-08-28 17:43:48,642|INFO|受控资产库新增
2022-08-28 17:43:48,820|INFO|点击DB安全
2022-08-28 17:43:49,070|INFO|弹出新窗口,点击请输入名称
2022-08-28 17:43:49,226|INFO|点击请输入系统名称
2022-08-28 17:43:49,569|INFO|点击请选择,选择数据源
2022-08-28 17:43:49,708|INFO|点击请选择,选择数据源

TrustZ_project1\testcase\test_create_controlled_property.py:15 (TestCreateControlledProperty.test_create_controlled_property)
self = <TrustZ_project1.testcase.test_create_controlled_property.TestCreateControlledProperty object at 0x00000266C77C8730>

def test_create_controlled_property(self):
 res=  self.home.go_to_controlled_property().click_add_cp().create_DB_sercurity().get_controlled_property_list().start_server()

…\TrustZ_project1\testcase\test_create_controlled_property.py:17:


…\TrustZ_project1\page_object\add_DB_security.py:56: in create_DB_sercurity
self.do_find(self.__BTN_SELECT_A).click()
…\venv\lib\site-packages\selenium\webdriver\remote\webelement.py:88: in click
self._execute(Command.CLICK_ELEMENT)
…\venv\lib\site-packages\selenium\webdriver\remote\webelement.py:396: in _execute
return self._parent.execute(command, params)
…\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py:428: in execute
self.error_handler.check_response(response)


self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x00000266C77E0280>
response = {‘status’: 400, ‘value’: ‘{“value”:{“error”:“element click intercepted”,“message”:“element click intercepted: Element …\n\tRtlGetAppContainerNamedObjectPath [0x77B37084+228]\n\tRtlGetAppContainerNamedObjectPath [0x77B37054+180]\n”}}’}

def check_response(self, response: Dict[str, Any]) -> None:
    """
    Checks that a JSON response from the WebDriver does not have an error.

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

    :Raises: If the response contains an error message.
    """
    status = response.get('status', None)
    if not status or status == ErrorCode.SUCCESS:
        return
    value = None
    message = response.get("message", "")
    screen: str = response.get("screen", "")
    stacktrace = None
    if isinstance(status, int):
        value_json = response.get('value', None)
        if value_json and isinstance(value_json, str):
            import json
            try:
                value = json.loads(value_json)
                if len(value.keys()) == 1:
                    value = value['value']
                status = value.get('error', None)
                if not status:
                    status = value.get("status", ErrorCode.UNKNOWN_ERROR)
                    message = value.get("value") or value.get("message")
                    if not isinstance(message, str):
                        value = message
                        message = message.get('message')
                else:
                    message = value.get('message', None)
            except ValueError:
                pass

    exception_class: Type[WebDriverException]
    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_SHADOW_ROOT:
        exception_class = NoSuchShadowRootException
    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.ELEMENT_NOT_INTERACTABLE:
        exception_class = ElementNotInteractableException
    elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
        exception_class = InvalidCookieDomainException
    elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
        exception_class = UnableToSetCookieException
    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
    elif status in ErrorCode.JAVASCRIPT_ERROR:
        exception_class = JavascriptException
    elif status in ErrorCode.SESSION_NOT_CREATED:
        exception_class = SessionNotCreatedException
    elif status in ErrorCode.INVALID_ARGUMENT:
        exception_class = InvalidArgumentException
    elif status in ErrorCode.NO_SUCH_COOKIE:
        exception_class = NoSuchCookieException
    elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN:
        exception_class = ScreenshotException
    elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED:
        exception_class = ElementClickInterceptedException
    elif status in ErrorCode.INSECURE_CERTIFICATE:
        exception_class = InsecureCertificateException
    elif status in ErrorCode.INVALID_COORDINATES:
        exception_class = InvalidCoordinatesException
    elif status in ErrorCode.INVALID_SESSION_ID:
        exception_class = InvalidSessionIdException
    elif status in ErrorCode.UNKNOWN_METHOD:
        exception_class = UnknownMethodException
    else:
        exception_class = WebDriverException
    if not value:
        value = response['value']
    if isinstance(value, str):
        raise exception_class(value)
    if message == "" and 'message' in value:
        message = value['message']

    screen = None  # type: ignore[assignment]
    if 'screen' in value:
        screen = value['screen']

    stacktrace = None
    st_value = value.get('stackTrace') or value.get('stacktrace')
    if st_value:
        if isinstance(st_value, str):
            stacktrace = st_value.split('\n')
        else:
            stacktrace = []
            try:
                for frame in st_value:
                    line = frame.get("lineNumber", "")
                    file = frame.get("fileName", "<anonymous>")
                    if line:
                        file = f"{file}:{line}"
                    meth = frame.get('methodName', '<anonymous>')
                    if 'className' in frame:
                        meth = "{}.{}".format(frame['className'], meth)
                    msg = "    at %s (%s)"
                    msg = msg % (meth, file)
                    stacktrace.append(msg)
            except TypeError:
                pass
    if exception_class == UnexpectedAlertPresentException:
        alert_text = None
        if 'data' in value:
            alert_text = value['data'].get('text')
        elif 'alert' in value:
            alert_text = value['alert'].get('text')
        raise exception_class(message, screen, stacktrace, alert_text)  # type: ignore[call-arg]  # mypy is not smart enough here
  raise exception_class(message, screen, stacktrace)

E selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (990, 335). Other element would receive the click:


  • E (Session info: chrome=104.0.5112.102)
    E Stacktrace:
    E Backtrace:
    E Ordinal0 [0x011B78B3+2193587]
    E Ordinal0 [0x01150681+1771137]
    E Ordinal0 [0x010641A8+803240]
    E Ordinal0 [0x01098C84+1019012]
    E Ordinal0 [0x01096C48+1010760]
    E Ordinal0 [0x0109493B+1001787]
    E Ordinal0 [0x01093699+997017]
    E Ordinal0 [0x01089223+954915]
    E Ordinal0 [0x010AD7AC+1103788]
    E Ordinal0 [0x01088C04+953348]
    E Ordinal0 [0x010AD9C4+1104324]
    E Ordinal0 [0x010BDAE2+1170146]
    E Ordinal0 [0x010AD5C6+1103302]
    E Ordinal0 [0x010877E0+948192]
    E Ordinal0 [0x010886E6+952038]
    E GetHandleVerifier [0x01460CB2+2738370]
    E GetHandleVerifier [0x014521B8+2678216]
    E GetHandleVerifier [0x012417AA+512954]
    E GetHandleVerifier [0x01240856+509030]
    E Ordinal0 [0x0115743B+1799227]
    E Ordinal0 [0x0115BB68+1817448]
    E Ordinal0 [0x0115BC55+1817685]
    E Ordinal0 [0x01165230+1856048]
    E BaseThreadInitThunk [0x7772F989+25]
    E RtlGetAppContainerNamedObjectPath [0x77B37084+228]
    E RtlGetAppContainerNamedObjectPath [0x77B37054+180]

    …\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py:243: ElementClickInterceptedException

    Assertion failed

    Assertion failed

    Assertion failed

    加了个等待列表展示



    提示超时
    …\TrustZ_project1\testcase\test_create_server.py::TestCreateServer::test_create_server 2022-08-30 09:29:32,253|INFO|访问登录
    FAILED [100%]CDwindow-6E72E2C29EE3BF3BAB4A43EB167C6DF5
    [‘CDwindow-6E72E2C29EE3BF3BAB4A43EB167C6DF5’]
    2022-08-30 09:29:33,154|INFO|点击展开
    2022-08-30 09:29:33,845|INFO|点击服务器菜单
    2022-08-30 09:29:37,108|INFO|服务器新增
    2022-08-30 09:29:37,252|INFO|点击新增代理服务
    2022-08-30 09:29:37,457|INFO|弹出新窗口,点击请选择
    2022-08-30 09:29:37,691|INFO|点击新窗口的主服务器
    2022-08-30 09:29:37,883|INFO|输入代理服务器
    2022-08-30 09:29:38,176|INFO|输入端口号
    2022-08-30 09:29:38,443|INFO|点击请选择,选择数据库类型

    TrustZ_project1\testcase\test_create_server.py:14 (TestCreateServer.test_create_server)
    self = <TrustZ_project1.testcase.test_create_server.TestCreateServer object at 0x000002B1BF09AD00>

    def test_create_server(self):
    
     res=  self.home.go_to_server().click_add().create_server().get_server_list()
    

    …\TrustZ_project1\testcase\test_create_server.py:16:


    …\TrustZ_project1\page_object\create_server.py:48: in create_server
    self.wait_elemnt_until_visible(self.__DATABASE_TYPE_LIST)
    …\TrustZ_project1\page_object\base_page.py:58: in wait_elemnt_until_visible
    return WebDriverWait(self.driver,10).until(expected_conditions.visibility_of_element_located(locator))


    self = <selenium.webdriver.support.wait.WebDriverWait (session=“a1a20a9641058cd6e1793041306589d9”)>
    method = <function visibility_of_element_located.._predicate at 0x000002B1BF0CDEE0>
    message = ‘’

    def until(self, method, message: str = ""):
        """Calls the method provided with the driver as an argument until the \
        return value does not evaluate to ``False``.
    
        :param method: callable(WebDriver)
        :param message: optional message for :exc:`TimeoutException`
        :returns: the result of the last call to `method`
        :raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
        """
        screen = None
        stacktrace = None
    
        end_time = time.monotonic() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.monotonic() > end_time:
                break
    
      raise TimeoutException(message, screen, stacktrace)
    

    E selenium.common.exceptions.TimeoutException: Message:

    …\venv\lib\site-packages\selenium\webdriver\support\wait.py:90: TimeoutException

    Assertion failed

    Assertion failed

    Assertion failed

    我这个是下拉列表的枚举值,不是悬浮,需要选择下拉列表的枚举值click才行

    我看到csdb的解决办法:不属于4,应该属于1和2
    1.首先看一下这个列表的内容是不是动态生成的;
    2.看元素是否可见,如果不可见通过操作js进行修改;
    3.看下页面是不是还没加载完成;
    4.如果不是上面3种原因,看看div是不是被包含到iframe里面了。确定具体属于哪种原因后,解决问题就变得容易了

    不是,远程之后我发现其实还是定位问题。 用xpath 定位之后 有两个Mysql ,你要用第二个,不能用第一个

    嗯嗯 :smiling_face_with_three_hearts: