appium 自動遍歷的參考程式碼
阿新 • • 發佈:2019-02-10
背景
上次支付寶沙龍分享了基於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和灰度對比