想问下,appcrawler 是什么时候停止遍历呢?App 所有页面基本已经遍历完了,但是会返回桌面继续遍历其他App ,并且一直不停止,这个需要怎么处理呢?
一般不会这样,它有个内置逻辑,跳出后会尝试backtoapp。你用的什么版本?
现象确实是这样的,而且测试过多次,页面基本覆盖了,但是遍历完后一直不会停止,会继续去遍历桌面其他的App。版本信息如下:
-
appium版本信息:1.21.0
-
appcrawler:2.4.0
-
命令:java -jar appcrawler-2.4.0-jar-with-dependencies.jar -c demo.yml appcrawler.yml
-
appcrawler.yml文件配置如下:
---
pluginList: []
saveScreen: true
reportTitle: ""
resultDir: "20211027095159"
waitLoading: 500
waitLaunch: 6000
showCancel: true
maxTime: 10800
maxDepth: 10
capability:
noReset: "true"
autoLaunch: "true"
fullReset: "false"
platformName: "Android"
platformVersion: ""
appium: "http://127.0.0.1:4723/wd/hub"
deviceName: "oppo"
appPackage: "com.jlpay.merch"
appActivity: ".ui.start.SplashActivity"
app: ""
testcase:
name: "TesterHome AppCrawler"
steps:
- xpath: "同意"
action: click
- xpath: "//*[@resource-id='com.jlpay.merch:id/et_login_account']"
action: "84931015812A00N"
time: "1"
- xpath: "//*[@resource-id='com.jlpay.merch:id/et_login_password']"
action: "123456Aa"
time: "1"
- xpath: "//*[@resource-id='com.jlpay.merch:id/btn_login']"
action: click
time: "1"
- xpath: "//*[@resource-id='com.jlpay.merch:id/btn_confirm']"
action: click
time: "1"
selectedList:
- given: []
when: null
then: []
xpath: "//*[contains(name(), 'Button')]"
action: null
actions: []
times: 0
- given: []
when: null
then: []
xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"
action: null
actions: []
times: 0
- given: []
when: null
then: []
xpath: "//*[@clickable='true']/*[contains(name(), 'Text') and string-length(@text)<10]"
action: null
actions: []
times: 0
- given: []
when: null
then: []
xpath: "//*[contains(name(), 'Image') and @clickable='true']"
action: null
actions: []
times: 0
- given: []
when: null
then: []
xpath: "//*[@clickable='true']/*[contains(name(), 'Image')]"
action: null
actions: []
times: 0
- given: []
when: null
then: []
xpath: "//*[contains(name(), 'Image') and @name!='']"
action: null
actions: []
times: 0
- given: []
when: null
then: []
xpath: "//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"
action: null
actions: []
times: 0
firstList: []
lastList: []
backButton:
- xpath: //*[contains(@resource-id, "im_back")]
- xpath: //*[contains(@text,'返回')]
triggerActions:
- given: []
when: null
then: []
xpath: "好"
action: click
actions: []
times: 10
- given: []
when: null
then: []
xpath: "允许"
action: click
actions: []
times: 10
xpathAttributes:
- "name"
- "label"
- "value"
- "resource-id"
- "content-desc"
- "instance"
- "text"
sortByAttribute:
- "depth"
- "list"
- "selected"
findBy: "xpath"
defineUrl: []
baseUrl: []
appWhiteList: []
urlBlackList: []
urlWhiteList: []
blackList:
- xpath: //*[contains(@resource-id,'btn_loginout')and contains(@text,'退出登录')]
- xpath: "分享至微信"
- xpath: "拍照.*"
- xpath: "相机"
- xpath: "解绑"
beforeRestart: []
beforeElement:
- given: []
when: null
then: []
xpath: "/*"
action: "Thread.sleep(500)"
actions: []
times: 0
afterElement: []
afterPage: []
afterPageMax: 2
tagLimitMax: 4
tagLimit:
- given: []
when: null
then: []
xpath: "确定"
action: null
actions: []
times: 1000
- given: []
when: null
then: []
xpath: "取消"
action: null
actions: []
times: 1000
- given: []
when: null
then: []
xpath: "share_comment_guide_btn_name"
action: null
actions: []
times: 1000
assertGlobal: []
还有个问题想问下,如果想同一个配置文件遍历Android和iOS的话,是通过androidCapability和iosCapability来控制吗?但是添加androidCapability的时候会报错,去掉androidCapability就成功了
你把appcrawler.log 发上来
appcrawler.log (3.5 MB)
- 上面是appcrawler.log日志,下面是截图,从红色那里开始跳出App,然后再也没回来过,一直在遍历其他App,从哔哩哔哩开始,我这边不得不结束遍历。
我这边也遇到了退出App遍历其他App的情况,想问一下问题解决了没有。 appwhitelist 是不是可以避免,这个怎么配置,有没有个模板
目前还没解决,app白名单我试过,直接用包名,表示只遍历这个包名的应用,不过没效果。。。你也可以试试
2021-10-29 09:50:34 INFO [Crawler.627.refreshPage] refresh page
2021-10-29 09:50:34 INFO [AppiumClient.102.getPageSourceWithRetry] start to get page source from appium
2021-10-29 09:50:34 INFO [AppiumClient.117.$anonfun$getPageSourceWithRetry$1] xml format
2021-10-29 09:50:34 INFO [Crawler.645.parsePageContext] appName =
2021-10-29 09:50:34 INFO [Crawler.649.parsePageContext] url=Launcher
2021-10-29 09:50:34 INFO [Crawler.673.parsePageContext] currentContentHash=0e8b2ae24b23a10ec4e28f59e61a4e3b la
stContentHash=8d7ae399f2a3cb17e093f4d94e4022a3
2021-10-29 09:50:34 INFO [Crawler.675.parsePageContext] ui change
2021-10-29 09:50:34 INFO [Crawler.931.saveDom] save to 20211027095159/506_MainActivity.tag=Back.id=Back.dom
2021-10-29 09:50:35 INFO [Crawler.953.saveScreen] start screenshot
2021-10-29 09:50:35 INFO [Crawler.956.$anonfun$saveScreen$2] ui change screenshot again
2021-10-29 09:50:38 INFO [Crawler.977.saveScreen] screenshot success
2021-10-29 09:50:38 INFO [Crawler.709.afterElementAction] backRetry=2
2021-10-29 09:50:38 INFO [Crawler.712.afterElementAction] afterElementAction eval
2021-10-29 09:50:38 INFO [ReportPlugin.36.afterElementAction] clickedElementsList size = 507
2021-10-29 09:50:38 INFO [Crawler.772.crawl]
crawl next
看起来是当前的app名字没获得正确,这一步是获取你的page source中的package字段,所以你得看看你的dom文件里有没有package这个字段。
另外 appcrawler 2.7.0已经发布了,可以试试新版本
- 是的,dom文件中package和我应用的不是同一个,用的是我手机oppo的启动包名“com.oppo.launcher”(详情如下:),正确应该是“com.jlpay.merch”,请问下这该怎么解决呢?dom文件我这边控制不了
<?xml version="1.0" encoding="UTF-8"?>
<hierarchy class="hierarchy" height="2288" index="0" rotation="0" width="1080">
<android.widget.FrameLayout bounds="[0,0][1080,2288]"
checkable="false" checked="false" class="android.widget.FrameLayout"
clickable="false" displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false" scrollable="false"
selected="false" text="">
<android.widget.LinearLayout bounds="[0,0][1080,2288]"
checkable="false" checked="false"
class="android.widget.LinearLayout" clickable="false"
displayed="true" enabled="true" focusable="false" focused="false"
index="0" long-clickable="false" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text="">
<android.widget.FrameLayout bounds="[0,0][1080,2288]"
checkable="false" checked="false"
class="android.widget.FrameLayout" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="android:id/content" scrollable="false"
selected="false" text="">
<android.widget.FrameLayout bounds="[0,0][1080,2288]"
checkable="false" checked="false"
class="android.widget.FrameLayout" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/launcher" scrollable="false"
selected="false" text="">
<android.widget.FrameLayout bounds="[0,0][1080,2288]"
checkable="false" checked="false"
class="android.widget.FrameLayout" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/drag_layer"
scrollable="false" selected="false" text="">
<android.widget.ScrollView bounds="[0,0][1080,2288]"
checkable="false" checked="false"
class="android.widget.ScrollView" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/workspace"
scrollable="true" selected="false" text="">
<android.view.ViewGroup bounds="[48,142][1032,1983]"
checkable="false" checked="false"
class="android.view.ViewGroup" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="6" long-clickable="false"
package="com.oppo.launcher" password="false"
scrollable="false" selected="false" text="">
<android.view.ViewGroup bounds="[48,142][1032,1983]"
checkable="false" checked="false"
class="android.view.ViewGroup" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false"
scrollable="false" selected="false" text="">
<android.widget.TextView bounds="[786,448][1032,754]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="哔哩哔哩" displayed="true" enabled="true"
focusable="true" focused="false" index="0"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text="哔哩哔哩"/>
<android.widget.TextView bounds="[294,754][540,1060]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="Leaks" displayed="true" enabled="true"
focusable="true" focused="false" index="1"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text="Leaks"/>
<android.widget.TextView bounds="[540,754][786,1060]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="电签测试程序" displayed="true"
enabled="true" focusable="true" focused="false"
index="2" long-clickable="true"
package="com.oppo.launcher" password="false"
scrollable="false" selected="false" text="电签测试程序"/>
<android.widget.TextView bounds="[786,754][1032,1060]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="嘉联支付" displayed="true" enabled="true"
focusable="true" focused="false" index="3"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text="嘉联支付"/>
<android.widget.TextView bounds="[48,1060][294,1366]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="Leaks" displayed="true" enabled="true"
focusable="true" focused="false" index="4"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text="Leaks"/>
</android.view.ViewGroup>
</android.view.ViewGroup>
</android.widget.ScrollView>
<android.widget.FrameLayout bounds="[0,1408][1080,2288]"
checkable="false" checked="false"
class="android.widget.FrameLayout" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="1" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/toggle_bar_root_top"
scrollable="false" selected="false" text=""/>
<android.view.View bounds="[252,1983][828,2082]"
checkable="false" checked="false"
class="android.view.View" clickable="false"
displayed="true" enabled="true" focusable="true"
focused="false" index="3" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/page_indicator"
scrollable="false" selected="false" text=""/>
<android.view.ViewGroup bounds="[0,2082][1080,2288]"
checkable="false" checked="false"
class="android.view.ViewGroup" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="4" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/hotseat"
scrollable="false" selected="false" text="">
<android.view.ViewGroup bounds="[48,2082][1032,2288]"
checkable="false" checked="false"
class="android.view.ViewGroup" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="0" long-clickable="false"
package="com.oppo.launcher" password="false"
scrollable="false" selected="false" text="">
<android.widget.TextView bounds="[48,2082][294,2288]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="拨号" displayed="true" enabled="true"
focusable="true" focused="false" index="0"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text=""/>
<android.widget.TextView bounds="[294,2082][540,2288]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="信息,有 3 个通知" displayed="true"
enabled="true" focusable="true" focused="false"
index="1" long-clickable="true"
package="com.oppo.launcher" password="false"
scrollable="false" selected="false" text=""/>
<android.widget.TextView bounds="[540,2082][786,2288]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="浏览器" displayed="true" enabled="true"
focusable="true" focused="false" index="2"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text=""/>
<android.widget.TextView bounds="[786,2082][1032,2288]"
checkable="false" checked="false"
class="android.widget.TextView" clickable="true"
content-desc="相机" displayed="true" enabled="true"
focusable="true" focused="false" index="3"
long-clickable="true" package="com.oppo.launcher"
password="false" scrollable="false" selected="false" text=""/>
</android.view.ViewGroup>
</android.view.ViewGroup>
<android.widget.RelativeLayout bounds="[0,2295][1080,2400]"
checkable="false" checked="false"
class="android.widget.RelativeLayout" clickable="false"
displayed="true" enabled="true" focusable="false"
focused="false" index="5" long-clickable="false"
package="com.oppo.launcher" password="false"
resource-id="com.oppo.launcher:id/apps_view"
scrollable="false" selected="false" text=""/>
</android.widget.FrameLayout>
</android.widget.FrameLayout>
</android.widget.FrameLayout>
</android.widget.LinearLayout>
</android.widget.FrameLayout>
</hierarchy>
2.7.0版本我试了下,App 遍历着就停住了,报下面的这个异常:另外,如果崩溃的话就退回到桌面,也是继续遍历其他App
Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: The element 'By.xpath: //*[@resource-id='com.jlpay.merch:id/tv_service_contract' and @text='服务协议']' does not exist in DOM anymore
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'kongdexideMac-mini.local', ip: 'fe80:0:0:0:1476:6fb1:79bd:45f2%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.16', java.version: '1.8.0_131'
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities {app: , appActivity: .ui.start.SplashActivity, appPackage: com.jlpay.merch, appium: http://127.0.0.1:4723/wd/hub, autoLaunch: true, databaseEnabled: false, desired: {app: , appActivity: .ui.start.SplashActivity, appPackage: com.jlpay.merch, appium: http://127.0.0.1:4723/wd/hub, autoLaunch: true, deviceName: oppo, fullReset: false, newCommandTimeout: 120, noReset: true, platformName: android, platformVersion: }, deviceApiLevel: 30, deviceManufacturer: OPPO, deviceModel: PDKM00, deviceName: NZKRMFZ9RSLRAQGY, deviceScreenDensity: 480, deviceScreenSize: 1080x2400, deviceUDID: NZKRMFZ9RSLRAQGY, fullReset: false, javascriptEnabled: true, locationContextEnabled: false, networkConnectionEnabled: true, newCommandTimeout: 120, noReset: true, pixelRatio: 3, platform: LINUX, platformName: Android, platformVersion: 11, statBarHeight: 112, takesScreenshot: true, viewportRect: {height: 2176, left: 0, top: 112, width: 1080}, warnings: {}, webStorageEnabled: false}
Session ID: e9640e53-1720-4977-911b-01aa9b940bca
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:250)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:41)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285)
at io.appium.java_client.DefaultGenericMobileElement.execute(DefaultGenericMobileElement.java:45)
at io.appium.java_client.MobileElement.execute(MobileElement.java:1)
at io.appium.java_client.android.AndroidElement.execute(AndroidElement.java:1)
at org.openqa.selenium.remote.RemoteWebElement.getLocation(RemoteWebElement.java:337)
at com.ceshiren.appcrawler.driver.SeleniumDriver.getRect(SeleniumDriver.scala:235)
at com.ceshiren.appcrawler.core.Crawler.saveElementScreenshot(Crawler.scala:1150)
at com.ceshiren.appcrawler.core.Crawler.doElementAction(Crawler.scala:1031)
at com.ceshiren.appcrawler.core.Crawler.crawl(Crawler.scala:999)
at com.ceshiren.appcrawler.core.Crawler.$anonfun$crawlWithRetry$1(Crawler.scala:187)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
at scala.util.Try$.apply(Try.scala:210)
at com.ceshiren.appcrawler.core.Crawler.crawlWithRetry(Crawler.scala:187)
at com.ceshiren.appcrawler.core.Crawler.start(Crawler.scala:169)
at com.ceshiren.appcrawler.AppCrawler$.startCrawl(AppCrawler.scala:333)
at com.ceshiren.appcrawler.AppCrawler$.parseParams(AppCrawler.scala:300)
at com.ceshiren.appcrawler.AppCrawler$.main(AppCrawler.scala:84)
at com.ceshiren.appcrawler.AppCrawler.main(AppCrawler.scala)
咨询下,2.7.0版本在哪里可以获取到,我想试一下
思寒大佬,如果appName = 空 这种情况的话,配置文件中appName需要指定和appPackage: "***"一致吗?这两个是不是同一个参数。
咨询下白名单你是怎么添加的?能发一下这部分的配置参数吗??
appWhiteList:# 不同App黑名单列表路径包名不同
我不知道这个参数是怎么配置的
appcrawler 的github官网,思寒大佬已经更新了 ,下载链接:
https://github.com/seveniruby/AppCrawler/releases/download/2.7.0-beta/appcrawler-2.7.0-jar-with-dependencies.jar
配置文件没有appName这个参数吧,两个重要参数:appPackage和appActivity
appWhiteList我是用包名配置的,表示整个app,urlWhiteList用activity相关页面,表示能遍历的activity,不知道配得对不对
我发现你的appName一直都是空的。我明天看看是什么原因,如果appName获取不到,就没法判断黑白名单
我这边appName也是空的,同样想咨询下 Appwhite 应该怎么配置? urlWhiteList我是配置的xpath,也不知道对不对,要是有两个参数配置的示例就很好了。