selenium - 通过可访问性 id 查找元素时 NoSuchElementException 的返回值是多少?
问题描述
我在 selenium 中编写了一个测试脚本。在其中,我尝试使用以下代码使用可访问性 id 查找元素:
someUIElement = self.driver.find_element_by_accessibility_id('some UI element')
但是,我在上面的行中得到了一个“NoSuchElementException”。
我尝试执行以下操作:
if self.driver.find_element_by_accessibility_id('some UI element') != None:
//do something
但是,它仍然抛出相同的异常,证明该值绝对不是“无”。我想知道当抛出以下异常时,将向变量“someUIElement”返回什么值?
错误跟踪:
self = <test_edit_profile.EditProfileTests testMethod=testPreOrderForPreviousOrders>
def testPreOrderForPreviousOrders(self):
self.driver.implicitly_wait(90)
if self.driver.find_element_by_accessibility_id('EditProfileButton') != None:
manageOrdersCell = self.driver.find_element_by_accessibility_id('Manage OrdersCell')
manageOrdersCell.click()
self.driver.implicitly_wait(5)
> if self.driver.find_element_by_accessibility_id('Reorder Button') != NoSuchElementException:
test_edit_profile.py:319:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/appium/webdriver/extensions/search_context/mobile.py:47: in find_element_by_accessibility_id
return self.find_element(by=MobileBy.ACCESSIBILITY_ID, value=accessibility_id)
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/appium/webdriver/webdriver.py:282: in find_element
return self.execute(RemoteCommand.FIND_ELEMENT, {'using': by, 'value': value})['value']
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
self.error_handler.check_response(response)
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/appium/webdriver/errorhandler.py:31: in check_response
raise wde
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/appium/webdriver/errorhandler.py:26: in check_response
super().check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <appium.webdriver.errorhandler.MobileErrorHandler object at 0x7fc1f00f62b0>
response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"An element could not be located on the page u...11)\\n at runMicrotasks (<anonymous>)\\n at processTicksAndRejections (internal/process/task_queues.js:85:5)"}}'}
def check_response(self, response):
"""
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 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)
if len(value.keys()) == 1:
value = value['value']
status = value.get('error', None)
if status is None:
status = value["status"]
message = value["value"]
if not isinstance(message, basestring):
value = message
message = message.get('message')
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.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 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', '<anonymous>')
if line:
file = "%s:%s" % (file, line)
meth = self._value_or_default(frame, 'methodName', '<anonymous>')
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:
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)
> raise exception_class(message, screen, stacktrace)
E selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py:242: NoSuchElementException
======================================================================================== short test summary info ========================================================================================
FAILED test_edit_profile.py::EditProfileTests::testPreOrderForPreviousOrders - selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given...
========================================================================================== 1 failed in 59.56s ===========================================================================================
解决方案
异常发生在self.driver.find_element_by_accessibility_id('Reorder Button')
. 因此,如果您尝试在条件或变量赋值中使用它,我相信异常会阻止上述尝试。
推荐阅读
- javascript - Js推入数组,该数组位于具有多个数组的对象中
- botframework - Microsoft 网络聊天自动滚动
- javascript - SHA256 Hashing Large files in angular 6 using Filereader Issue
- python - 简化 main1.py 或 main2.py 调用 middle.py 调用 sub1.py 或 sub2.py
- node.js - 无法在 NodeJS 应用程序中的 Heroku 上添加 npm 模块
- awk - 如何使用 bash 替换文件中非常复杂的文本?
- ruby-on-rails - 使用条纹宝石进行条纹异常双重渲染
- swift - 将文件上传到 S3 服务 403 错误 (com.amazonaws.AWSS3TransferUtilityErrorDomain 错误 2.) Swift iOS
- javascript - 使用 Vue Test Utils 测试嵌套 div
- qt-creator - 安装后如何将 Qt 工具包添加到 Qt 创建器?