1. 程式人生 > >appium 自動遍歷的參考程式碼

appium 自動遍歷的參考程式碼

背景

上次支付寶沙龍分享了基於appium的自動遍歷小工具, 有些朋友感興趣, 想看下程式碼,
為了給大家一個參考, 我這裡貼部分的關鍵演算法程式碼給大家吧
這份程式碼寫的很挫, 功能也很簡單, 只是個演示demo, 是為了證明appium can do IT.
我計劃用Java重構, 這個只當是參考吧

部分程式碼參考

    def capabilities
        {
            'browserName' => '',
            'device' => 'android',
            'version' => '4.1'
, 'app-activity'=> 'com.taobao.tao.Welcome', 'app-package'=> 'com.taobao.taobao' #'app-activity'=> '.activity.MainActivity', #'app-package'=> 'com.sankuai.meituan' } end def setup server_url = 'http://127.0.0.1:4723/wd/hub'
@driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => server_url) @driver.manage.timeouts.implicit_wait = 30 # seconds puts 'sleep 20' sleep 20 @driver end def config() @config={} @config['blacklist'
]=['立即搶購', '美團承諾 團購無憂', '退款'] end def refresh() root=[] el_array=@driver.find_elements(:xpath, "//text[@clickable=true]") #如果點選沒有發生變化, 就跳過 if el_array.size==@list.size return @list end el_array.each do |node| begin text=node.text location=node.location is_skip=false next if text.strip=='' next if text.size<2 @config['blacklist'].each do |keyword| if text.index(keyword) is_skip=true break end end next if is_skip current={} current['click']=false #位置相差不大 也認為是相同 current['sign']=text+'|'+location.x.to_s[0..1] current['text']=text current['object']=node root << current rescue Exception=>e puts e.message end end root end def find_return_root(el) current=nil @nodes.each do |node| if node.content['sign']==el['sign'] current=node break end end current=current.parent if current return(current) end def travel() @list||=[] @nodes ||= Tree::TreeNode.new("ROOT", {}) @current||=@nodes @index||=0 @index+=1 @list=refresh() has_new=false return_root=nil @list.each do |el| #判斷是否曾經出現過 return_root=find_return_root(el) if return_root==nil has_new=true #如果是新元素, 就新增到tree中 @current << Tree::TreeNode.new(el['sign'], el) end end #如果沒有新元素, 代表回到某個父節點 if has_new==false @current=return_root end save() if @current.level>7 @driver.navigate.back travel() end #從未被點選的地方點選 current=nil @current.children.each do |child| if child.content['click']==false current=child @list.each do |node| if node['sign']==current.content['sign'] current.content['click']=true @current=current node['object'].click sleep 3 travel() break end end break end end if current==nil @driver.navigate.back travel() end end

執行結果

因為這次採用的是uiautomator, 程式碼也優化, 所以執行時間很長
跑十幾分鍾, 手機就因為鎖屏失敗, 所以針對淘寶app, 我一直沒跑全過, 生成的思維導圖只是淘寶部分欄目的淺層結構圖 想跑全的話, 就自己修改手機, 或者用虛擬機器吧

如下是生成的結果:

計劃

我接下來, 我在做上次分享的ppt最後一頁的事情, 我想基於這個搞個線上服務. 有實力感興趣的同學可以報名參加.
主要是為第三方的企業提供app遍歷和附加服務. 一個實驗性的技術專案.
目標
1. 優化速度
2. 優化演算法, 解決迴環
3. 自動生成appium的自動化程式碼
4. 支援規則
5. 從ruby轉到java上去實現
6. 做個服務網站
7. 支援dom diff和灰度對比