随便找个专门做测试的机构呗,比如柠檬啥的
这个会比 fiddler 好用么
其实就是项目对口经验吧
我也遇到过,你有 appium 和 selenium 切换的操作吗
这个推荐,超级好用
问题已经不是该不该卖的问题了,是能不能卖得出的问题,想要真正脱手就得准备好被别人大砍一刀
有没有大佬遇到过
好的谢谢
请问 nico 对比市面上常用的 appium 的优势在哪?当时是为啥会放弃使用 uiautomator appium 这些选择自己写的呢?
weditor 用了好多年了,不知道这个新版 RN 能不能抓到
好东西呀老哥,要是能开源就好了
作为普通人来说,最快最轻松的方法就是,找个机构的自动化系统课程视频(一般 pdd 咸鱼什么的),然后一节课一节课跟着学跟着敲,然后把公司的项目套进来,然后就大差不差了,
工作不是必需品,但面试你必须会,哦不对,你不写技术估计简历在 hr 哪都过不了别说面试了
话说:driver.terminate_app("com.xxx.xxx") 这个是官方推荐的终止 APP 方法,, 这些信息大佬都是在哪里看到的
?
没错,我最后就是用的这个方法,想问下大佬最近有没有用过 appium2,感觉好容易闪退啊,不知道有没有遇到过
这个问题确实如你所说,我用其他方式处理了, 顺便想问下大佬最近有没有用过 appium2,感觉好容易闪退啊,不知道有没有遇到过
感谢大佬!
test_case/test_login.py:18 (TestLogin.test_login[RenphoHealth-account_data0])
request = <SubRequest 'init_driver' for <Function test_login[RenphoHealth-account_data0]>>
@pytest.fixture()
def init_driver(request):
# 前置
driver = webdriver.Remote(appium_server_url, options=AppiumOptions().load_capabilities(capabilities))
# 使用Allure的attach方法将配置信息作为文本附件添加到报告中
attach_name = "Appium Configuration"
attach_content = "\n".join([f"{key}: {value}" for key, value in capabilities.items()])
allure.attach(attach_content, name=attach_name, attachment_type=allure.attachment_type.TEXT)
yield driver
# 后置
> driver.close()
conftest.py:53:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:459: in close
self.execute(Command.CLOSE)
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py:348: in execute
self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <appium.webdriver.errorhandler.MobileErrorHandler object at 0x1037ed990>
response = {'status': 404, 'value': '{"value":{"error":"unknown command","message":"The requested resource could not be found, or...tory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)\\n\\tat java.lang.Thread.run(Thread.java:1012)\\n"}}'}
def check_response(self, response: Dict[str, Any]) -> None:
"""
https://www.w3.org/TR/webdriver/#errors
"""
payload = response.get('value', '')
if isinstance(payload, dict):
payload_dict = payload
else:
try:
payload_dict = json.loads(payload)
except (json.JSONDecodeError, TypeError):
return
if not isinstance(payload_dict, dict):
return
value = payload_dict.get('value')
if not isinstance(value, dict):
return
error = value.get('error')
if not error:
return
message = value.get('message', error)
stacktrace = value.get('stacktrace', '')
# In theory, we should also be checking HTTP status codes.
# Java client, for example, prints a warning if the actual `error`
# value does not match to the response's HTTP status code.
exception_class: Type[sel_exceptions.WebDriverException] = ERROR_TO_EXC_MAPPING.get(
error, sel_exceptions.WebDriverException
)
if exception_class is sel_exceptions.WebDriverException and message:
if message == 'No such context found.':
exception_class = appium_exceptions.NoSuchContextException
elif message == 'That command could not be executed in the current context.':
exception_class = appium_exceptions.InvalidSwitchToTargetException
if exception_class is sel_exceptions.UnexpectedAlertPresentException:
raise sel_exceptions.UnexpectedAlertPresentException(
msg=message,
stacktrace=format_stacktrace(stacktrace),
alert_text=value.get('data'),
)
> raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
E selenium.common.exceptions.UnknownMethodException: Message: The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource
E Stacktrace:
E io.appium.uiautomator2.common.exceptions.UnknownCommandException: The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource
E at io.appium.uiautomator2.http.ServerHandler.channelRead(ServerHandler.java:84)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
E at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
E at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
E at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
E at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:435)
E at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
E at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
E at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:250)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
E at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
E at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
E at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
E at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
E at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
E at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911)
E at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
E at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:611)
E at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:552)
E at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:466)
E at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438)
E at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)
E at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
E at java.lang.Thread.run(Thread.java:1012)
上面发了
这是我的 caps 其实主要就是 appium:noReset: false
真的没人吗 555
@Morii 大佬 我遇到一样的问题,请问你是怎么解决的
可是 塔底大不大 塔尖就这么大啊