Appium 使用 RobotFramework 运行 appium 测试用例

思寒_seveniruby · 2013年12月13日 · 最后由 丧尸没有牙齿 回复于 2018年05月10日 · 2107 次阅读
本帖已被设为精华帖!

Appium 支持 Webdriver 协议.
RobotFramework 也支持 Webdriver 协议.
所以是可以用 RobotFramework 来运行 appium 测试案例了

我在 ppt 里面的演示, 也是基于 RF 的.

但是因为一些特殊的原因, 比如 RF 会访问一些 appium 不支持的协议. 比如异步脚本协议.
appium 会默认返回一个 503 暂未实现的错误, 这样 RF 的测试用例就无法运行了.

所以解决方法是修改 appium 的代码. 让协议的返回代码从错误改成 200 正常.

代码修改如下

var notYetImplemented = exports.notYetImplemented = function(req, res) {
  logger.info("Responding to client that a method is not implemented");
  res.send(501, {
    status: status.codes.UnknownError.code
    , sessionId: getSessionId(req)
    , value: {
      message: "Not yet implemented. " +
               "Please help us: http://appium.io/get-involved.html"
    }
  });
};

修改为

var notYetImplemented = exports.notYetImplemented = function(req, res) {
  logger.info("Responding to client that a method is not implemented");
  res.send(501, {
    status: status.codes.Success.code
    , sessionId: getSessionId(req)
    , value: {
      message: "Not yet implemented. " +
               "Please help us: http://appium.io/get-involved.html"
    }
  });
};
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 45 条回复 时间 点赞

能不修改,用 stub 么?

#1 楼 @lihuazhang 可以考虑写 js 重载 rf 是直接发到了 appium 也可以在中间加代理去掉不支持的请求 但这样会导致更新问题 如果不支持的协议某天支持了 你的代理或者 js 都得更新 我更倾向于让 appium 返回一个报警而不是错误 从 rf 里面修改代码也可以

@seveniruby 你好不知能否 share 下你用 robotframework+appium 测试淘宝的 txt 内容吗,或者不方便的话能否私信,万分感谢,

#3 楼 @luis ppt 里面都有啊 你遇到什么问题了?

#4 楼 @seveniruby 那个 open app 的 keyword 是分享下吗。。。

*** Keywords ***
open app
    [Arguments]    ${package}    ${activity}
    ${capabilities}=    Create Dictionary
    Set To Dictionary    ${capabilities}    browserName    android
    Set To Dictionary    ${capabilities}    version    4.1
    Set To Dictionary    ${capabilities}    platform    linux
    Set To Dictionary    ${capabilities}    takesScreenshot    false
    Set To Dictionary    ${capabilities}    javascriptEnabled    false
    Set To Dictionary    ${capabilities}    app-activity    ${activity}
    Set To Dictionary    ${capabilities}    app-package    ${package}
    Log Dictionary    ${capabilities}
    Close Browser
    Close All Browsers
    Set Selenium Timeout    30
    Open Browser    \    browser=android    remote_url=http://127.0.0.1:4723/wd/hub    desired_capabilities=${capabilities}

@sevenirub 你好,能问下这个改动是那个 appium 文件吗

@seveniruby 我拿你的例子,自己修改了 open app 如下,然后修改了 appium server 下面的 response.js 文件,但是 FR run 的时候还是老报错。大神能帮忙看下吗,真是不好意思了,最近问题很多。。。

Appium log:

RF 错:
20131218 09:48:28.374 : INFO : Opening browser 'android' to base url '' through remote server at 'http://127.0.0.1:4723/wd/hub'
20131218 09:48:37.556 : FAIL : No browser is open
20131218 09:48:37.556 : WARN : Keyword 'Capture Page Screenshot' could not be run on failure: No browser is open
20131218 09:48:37.557 : FAIL : WebDriverException: Message: u'The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.'

@seveniruby ,能否帮忙看下。。。

#9 楼 @luis 你没有调用 open app 吗, 没看到你调用.
另外, 错误里面说, 有个方法 selendroid 不支持, 你可以先用 uiautomator 试试, 换个 4.1.2 以上的虚拟机验证下你的脚本

#10 楼 @seveniruby 我 show 出来的是 opp app 的代码,我换了 UIautomator 是 ok 的,所以我在找这个 selendroid 的这个错误是从那个方法抛出来的,看看改了行不行唉真心坑多啊。。。

#11 楼 @luis selendroid 不支持跨 app, appium 官方也在文档里面提了, 说 selendroid 的 api 有些行为跟正常的 appium 有差别, 他们也在吐槽..

没看到有 ppt 能发我一份么,你的 rf 是安装在 mac 系统上的么

#13 楼 @atm123 我用的是 windows, ppt 自己在论坛上搜索吧

请问下 selenium 中的 webdriver 怎么导入到 ride 中,我直接写 selenium 或者直接路径都不行,library 那边还是显示红色。导入 webdriver 还需要做什么操作么

@atm123 ,如果你 selenium2library 装好的话,路径直接填这个就行了

@seveniruby ,目前不改 rf 的 selenium2library 支持 appium 还很困难,各种 post 不支持

#17 楼 @luis appium 只支持 selenium 的子集, 关注他支持的功能就可以了. 其他的也基本用不到.

恩,问题就在于直接调用现成 keyword,很多协议不支持。。。

#19 楼 @luis 举个例子吧, 我不太明白.
这个协议其实是 webdriver 的, ruby 和 python 能做的, robot 也能做, robot 跟 python 调用本质都是一样的.

比如说 open browser,或者 capture page screenshot,背后会转换成多个 post 请求到 device 上的 service.无论 uiautomator 或者 selendroid 都对一些协议不支持,所以 rf 会 fail.....async_script 的 501 的错只是一个例子,还会有更多的 status code 错,所以改 appium 的话感觉不太好,毕竟对于 appium 来说它返回的信息是对的,所以改发出请求源头的 rf 会比较好。。。。@seveniruby

#21 楼 @luis 你不是修改了代码吗, 修改后就没问题了

@seveniruby 那段代码只会 uiautomator 走到,selendroid 不走那段,走的 proxy.js,各种 status code 错。。。我只有屏蔽那些错才会 pass,但是怕把正常的错也屏蔽了。。。

#23 楼 @luis 同样的道理, 你可以修改 selendroid 的返回值试试. 估计也只是一个地方.

@seveniruby 是的不只一个返回值错,所以我才说从源头把没支持的 post 屏蔽掉。。。

#25 楼 @luis 修改 python 的 webdriver 实现也是可以的, 我以前也试过修改, 但是发现重新部署很麻烦, 所以就干脆修改 appium, 因为这个是服务端, 只有一个, 部署还见到那些. 我感觉还是从 appium 下手比较好.

@lius@seveniruby 请问下如果测试的不是 web 而是手机的程序只用 selenium2library 也可以么,我看 selenium2library 里面没有识别设备的 webdriver 的方法哦

是不是用这个 RobotFramework 运行 appium 用例就可以生成 rf 一样好看的报告呢?

不错,终于也跑起来了

@oscar Hi,我的安装 上面的 keyword,一直提示
[ WARN ] Keyword 'Capture Page Screenshot' could not be run on failure: No browser is open。
但是 keyword 没有 ‘Capture Page Screenshot ’ ,怎么回事呢?
谢谢啊.

#30 楼 @jacky 按作者一样修改一下 response.js

#6 楼 @seveniruby Create Dictionary 是什么啊?加载的库 还是自己写的关键字?

#2 楼 @seveniruby 我的 testcase 关键字之间传递参数出现问题,能否帮忙看下,谢谢:
testcase_
open app
sleep 10s
${driver} = open app
sleep 10s
click button ${driver}
脚本是这样的:
def open_app():
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Android Emulator'

desired_caps['appPackage'] = 'com.xxx.xxx'
desired_caps['appActivity'] = '.activity.xxxActivity'

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(10)
return driver
def click_button(dr):
radio_setting = dr.find_element_by_id('com.xxx.xxx:id/radio_setting')
radio_setting.click()

执行时,第一步 open app 通过,到了 click button 报错:error: Failed to start an Appium session, err was: Error: Requested a new session but one was in progress。请问是什么问题呢?

appium 可以单独使用吗?为什么要和 robotframework 结合使用呀

你好,请问下,起使用 Appium+Robotframework+python;
1.需要导入那些库啊,已经导入了一个 robotframework-appiumlibrary,还有哪些要用的?
2.那些底层的关键字在哪里可以编辑?
求大侠赐教,非常感谢。。。

你好,请问下,使用 Appium+Robotframework+python;
1.需要导入那些库啊,已经导入了一个 robotframework-appiumlibrary,还有哪些要用的?
2.那些底层的关键字在哪里可以编辑?
求大侠赐教,非常感谢。。。

@711child appium 进程在前面一次运行中还没关掉,重新启动下 appium server

response.js 怎么修改。我是也报 Keyword 'Capture Page Screenshot' could not be run on failure: No application is open

改了还是不行啊

Keyword 'AppiumLibrary.Open Application' expected 1 to 2 non-keyword arguments, got 5.

#38 楼 @cair01 我也遇到和你同样的问题,你的解决了吗?

Keyword 'AppiumLibrary.Open Application' expected 1 to 2 non-keyword arguments, got 8.

jacky 回复

我是运行 appiumLibrary 出现的这个问题 ,没有找到 appium server, 搜索 response.js 文件 发现我的 appium 1.6.5 在 C:\Users\admin\AppData\Local\Programs\appium-desktop\resources\app\node_modules\appium\node_modules\express\lib 这个目录下

我是运行 appiumLibrary 出现的这个问题 ,没有找到 appium server, 搜索 response.js 文件 发现我的 appium 1.6.5 在 C:\Users\admin\AppData\Local\Programs\appium-desktop\resources\app\node_modules\appium\node_modules\express\lib 这个目录下,而且这个文件下没有找到修改前的代码

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册