选择器与节点操作
<p>[TOC]</p>
<h1>By选择器</h1>
<p>By的所有静态方法返回一个BySelector对象用于查找节点:node = findView(By.text("JsDroid").desc("这是一个按钮"))</p>
<h2>clazz 类名</h2>
<pre><code class="language-javascript">//clazz节点选择器
By.clazz(&quot;android.widget.TextView&quot;)
//正则表达式匹配类名
By.clazz(Pattern.compile(&quot;.*TextView.*&quot;))
</code></pre>
<h2>desc 介绍文字</h2>
<pre><code class="language-javascript">//全匹配
By.desc(&quot;这是一个按钮&quot;)
//包含
By.descContains(&quot;按钮&quot;)
//文字开头
By.descStartsWith(&quot;这是&quot;)
//文字结尾
By.descEndsWith(&quot;按钮.&quot;)
//正则表达式
By.desc(Pattern.compile(&quot;.*按钮.*&quot;))</code></pre>
<h2>pkg 包名</h2>
<pre><code class="language-javascript">//全匹配
By.pkg(&quot;com.jsdroid&quot;)
//正则表达式
By.pkg(Pattern.compile(&quot;com.*&quot;))
</code></pre>
<h2>res 资源ID</h2>
<pre><code class="language-javascript">//全匹配
By.res(&quot;com.jsdroid:/xxx&quot;)
//分解包名与id
By.res(&quot;com.jsdroid&quot;,&quot;xxx&quot;)
//正则表达式
By.res(Pattern.compile(&quot;.*xxx&quot;))
</code></pre>
<h2>text 文字</h2>
<pre><code class="language-javascript">//全匹配
By.text(&quot;JsDroid&quot;)
//文字包含
By.textContains(&quot;D&quot;)
//文字开头
By.textStartsWith(&quot;Js&quot;)
//文字结尾
By.textEndsWith(&quot;Droid&quot;)
//正则表达式
By.text(Pattern.compile(&quot;.*Droid&quot;))
</code></pre>
<h2>index 序号</h2>
<pre><code class="language-javascript">By.index(1)</code></pre>
<h2>bounds 范围</h2>
<pre><code class="language-javascript">By.bounds(1,2,200,300)</code></pre>
<h2>checkable 是否可选</h2>
<pre><code class="language-javascript">By.checkable(true)
</code></pre>
<h2>checked 是否选中</h2>
<pre><code class="language-javascript">By.checked(true)
</code></pre>
<h2>clickable 是否可点击</h2>
<pre><code class="language-javascript">By.clickable(true)
</code></pre>
<h2>enabled 是否可操作</h2>
<pre><code class="language-javascript">By.enabled(true)
</code></pre>
<h2>focusable 是否可置焦点</h2>
<pre><code class="language-javascript">By.focusable(true)
</code></pre>
<h2>focused 是否已置焦点</h2>
<pre><code class="language-javascript">By.focused(true)
</code></pre>
<h2>longClickable 是否可以长按</h2>
<pre><code class="language-javascript">By.longClickable(true)
</code></pre>
<h2>scrollable 是否可以滚动</h2>
<pre><code class="language-javascript">By.scrollable(true)
</code></pre>
<h2>selected 是否可以下拉</h2>
<pre><code class="language-javascript">By.selected(true)
</code></pre>
<h2>depth 深度</h2>
<pre><code class="language-javascript">//选择根节点
By.depth(0)
//选择最小深度1,最大选择5
By.depth(1,5)
</code></pre>
<h2>hasChild 包含子节点</h2>
<pre><code class="language-javascript">By.hasChild(By.text(&quot;JsDroid&quot;))
</code></pre>
<h2>hasDescendant 包含节点</h2>
<pre><code class="language-javascript">//全搜索
By.hasDescendant(By.text(&quot;JsDroid&quot;))
//限制相对深度搜索
By.hasDescendant(By.text(&quot;JsDroid&quot;),10)
</code></pre>
<h2>多属性匹配</h2>
<pre><code class="language-javascript">By.text(&quot;JsDroid&quot;).desc(&quot;这是一个按钮&quot;).res(&quot;com.jsdroid:/.&quot;)</code></pre>
<h2>联级匹配</h2>
<pre><code class="language-javascript">//成功返回前面的节点
By.text(&quot;JsDroid&quot;).desc(&quot;这是一个按钮&quot;).res(&quot;com.jsdroid:/.&quot;).hasChild(By.text(&quot;JsDroid&quot;))
//成功返回后面的节点
By.clazz('android.view.ViewGroup').child(By.clazz('android.widget.FrameLayout').child(By.text('系统应用'))).getText()
//运行返回:系统应用</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d51dc7f2c0d9f7566cc1aeb20402237e&amp;file=file.png" alt="" /></p>
<h1>节点操作</h1>
<ul>
<li>
<p>两种查找节点方法:</p>
<ul>
<li>方法1:
<h2>findView 查找单个节点</h2>
<pre><code class="language-javascript">//查找节点文字为JsDroid的节点
node = findView(By.text(&quot;JsDroid&quot;))
if(node!=null){
node.getText()
//点击节点
node.click()
}
//查找单个节点 ,等待5秒
node = waitView(By.text(&quot;JsDroid&quot;))
if(node!=null){
node.getText()
//点击节点
node.click()
}</code></pre>
<h2>findViews 查找获取多个节点</h2>
<pre><code class="language-javascript">//查找所有文本节点
nodes = findViews(By.clazz(&quot;android.widget.TextView&quot;))
for(var i=0;i&lt;nodes.size();i++){
//获取节点的文本
var text = nodes.get(i).getText()
}</code></pre></li>
<li>
<p>方法2:
直接使用By中的方法</p>
<pre><code class="language-javascript">//查找单个节点
node=By.text(&quot;JsDroid&quot;).getView()
//查找单个节点 ,取第3个节点
node=By.text(&quot;JsDroid&quot;).getViewAt(2)
//查找单个节点 ,等待5秒
node=By.text(&quot;JsDroid&quot;).getView(5000)
//查找单个节点 ,等待5秒,取第3个节点
node=By.text(&quot;JsDroid&quot;).getViewAt(2,5000)
//查找获取多个节点
nodes=By.text(&quot;JsDroid&quot;).getViews()
//查找获取多个节点,等待5秒
nodes=By.text(&quot;JsDroid&quot;).getViews(5000)</code></pre>
<h2>取兄弟节点</h2>
<pre><code class="language-javascript">node=By.text('雷电游戏中心').desc('雷电游戏中心').getbrother(-1)
if(node){
node.getText()
}else{
取兄弟节点失败'
}</code></pre>
</li>
</ul>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=13cf87efd1de0df2b48370c384421733&amp;file=file.png" alt="" /></p>
</li>
</ul>
<h2>hasObject 是否存在节点</h2>
<ul>
<li>方法1:
<pre><code class="language-javascript">var r = device.hasObject(By.text(&quot;JsDroid&quot;));
if(r){
//存在
}</code></pre></li>
<li>方法2:
<pre><code class="language-javascript">//取匹配节点的text
r =By.text(&quot;JsDroid&quot;).has();
//等待5秒
r =By.text(&quot;JsDroid&quot;).has(5000);
if(r){
//存在
}</code></pre></li>
</ul>
<h2>getText 获取文字</h2>
<ul>
<li>方法1:
<pre><code class="language-javascript">var node = findView(By.text(&quot;JsDroid&quot;));
if(node){
text = node.getText()
}</code></pre></li>
<li>方法2:
<pre><code class="language-javascript">//取匹配节点的text
text =By.text(&quot;JsDroid&quot;).getText();
//等待5秒
text =By.text(&quot;JsDroid&quot;).getText(5000);
//取第3个节点的text
text =By.text(&quot;JsDroid&quot;).getTextAt(2);
//等待5秒,取第3个节点的text
text =By.text(&quot;JsDroid&quot;).getTextAt(2,5000);</code></pre></li>
</ul>
<h2>getResourceName 获取res</h2>
<ul>
<li>方法1:
<pre><code class="language-javascript">var node = findView(By.text(&quot;JsDroid&quot;));
if(node){
res = node.getResourceName()
}</code></pre></li>
<li>方法2:
<pre><code class="language-javascript">//取匹配节点的res
res =By.text(&quot;JsDroid&quot;).getRes();
//等待5秒
res =By.text(&quot;JsDroid&quot;).getRes(5000);
//取第3个节点的res
res =By.text(&quot;JsDroid&quot;).getResAt(2);
//等待5秒,取第3个节点的res
res =By.text(&quot;JsDroid&quot;).getResAt(2,5000);</code></pre>
<h2>getClassName 获取类名class</h2>
<ul>
<li>方法1:
<pre><code class="language-javascript">var node = findView(By.text(&quot;JsDroid&quot;));
if(node){
className = node.getClassName()
}</code></pre></li>
<li>方法2:
<pre><code class="language-javascript">//取匹配节点的class
className =By.text(&quot;JsDroid&quot;).getclass();
//等待5秒
className =By.text(&quot;JsDroid&quot;).getclass(5000);
//取第3个节点的class
className =By.text(&quot;JsDroid&quot;).getclassAt(2);
//等待5秒,取第3个节点的class
className =By.text(&quot;JsDroid&quot;).getclassAt(2,5000);</code></pre></li>
</ul></li>
</ul>
<h2>getContentDescription 描述文字desc</h2>
<ul>
<li>方法1:
<pre><code class="language-javascript">var node = findView(By.text(&quot;JsDroid&quot;));
if(node){
desc = node.getContentDescription()
}</code></pre></li>
<li>方法2:
<pre><code class="language-javascript">//取匹配节点的desc
desc =By.text(&quot;JsDroid&quot;).getDesc();
//等待5秒
desc =By.text(&quot;JsDroid&quot;).getDesc(5000);
//取第3个节点的desc
desc =By.text(&quot;JsDroid&quot;).getDescAt(2);
//等待5秒,取第3个节点的desc
desc =By.text(&quot;JsDroid&quot;).getDescAt(2,5000);</code></pre></li>
</ul>
<h2>getVisibleBounds 获取可见范围bounds</h2>
<ul>
<li>
<p>方法1:</p>
<pre><code class="language-javascript">var node = findView(By.text(&quot;JsDroid&quot;));
if(node){
bounds = node.getVisibleBounds()
print(bounds.left)
print(bounds.top)
print(bounds.right)
print(bounds.bottom)
}</code></pre>
</li>
<li>方法2:
<pre><code class="language-javascript">//取匹配节点的bounds
bounds =By.text(&quot;JsDroid&quot;).getRect();
//等待5秒
bounds =By.text(&quot;JsDroid&quot;).getRect(5000);
//取第3个节点的bounds
bounds =By.text(&quot;JsDroid&quot;).getRectAt(2);
//等待5秒,取第3个节点的bounds
bounds =By.text(&quot;JsDroid&quot;).getRectAt(2,5000);</code></pre></li>
</ul>
<h2>click 点击节点</h2>
<ul>
<li>
<p>方法1:</p>
<pre><code class="language-javascript">var node = findView(By.text(&quot;JsDroid&quot;));
if(node){
node.click()
}</code></pre>
</li>
<li>
<p>方法2:</p>
<pre><code class="language-javascript">//点击节点
result =By.text(&quot;JsDroid&quot;).click();
//等待5秒
result =By.text(&quot;JsDroid&quot;).click(5000);
//点击第3个节点
result =By.text(&quot;JsDroid&quot;).clickAt(2);
//等待5秒,点击第3个节点
result =By.text(&quot;JsDroid&quot;).clickAt(2,5000);</code></pre>
<h2>获取父节点</h2>
<p><code>node = node.getParent() </code></p>
<h2>取子节点数量</h2>
<p><code>count = node.getChildCount() </code></p>
<h2>取子节点集合</h2>
<p><code>childList = node.getChildren() </code></p>
<h2>是否包含节点</h2>
<p><code>node.hasObject(By.text(&quot;JsDroid&quot;)) </code></p>
<h2>查找节点</h2>
<pre><code class="language-javascript">//查找单个
n = node.findObject(By.text(&quot;JsDroid&quot;))
//查找多个
n = node.findObjects(By.text(&quot;JsDroid&quot;))
</code></pre>
<h2>获取中心点</h2>
<pre><code class="language-javascript">point = node.getVisibleCenter()
print(point.x)
print(point.y)
</code></pre>
<h2>获取所属app的pkg</h2>
<pre><code class="language-javascript">pkg = node.getApplicationPackage()
print(pkg)
</code></pre>
<h2>是否可以选择</h2>
<pre><code class="language-javascript">node.isCheckable()
</code></pre>
<h2>是否已选择</h2>
<p><code>node.isChecked() </code></p>
<h2>是否可点击</h2>
<p><code>node.isClickable() </code></p>
<h2>是否可操作</h2>
<p><code>node.isEnabled() </code></p>
<h2>是否可聚焦</h2>
<p><code>node.isFocusable() </code></p>
<h2>是否已聚焦</h2>
<p><code>node.isFocused() </code></p>
<h2>是否可以长按</h2>
<p><code>node.isLongClickable() </code></p>
<h2>是否可以滑动</h2>
<p><code>node.isScrollable() </code></p>
<h2>是否被选择</h2>
<p><code>node.isSelected() </code></p>
<h2>清空文字</h2>
<p><code>node.clear() </code></p>
<h2>拖动</h2>
<pre><code class="language-javascript">//将节点拖动到100,100的位置
node.drag(new android.graphics.Point(100,100))
//将节点拖动到100,100的位置,速度100
node.drag(new android.graphics.Point(100,100),100)
</code></pre>
<h2>长按</h2>
<p><code>node.longClick() </code></p>
<h2>捏紧手势</h2>
<pre><code class="language-javascript">//捏紧80% ,默认速度2500*density
node.pinchClose(0.8)
//捏紧80%,速度1000
node.pinchClose(0.8,1000)
</code></pre>
<h2>捏开手势</h2>
<pre><code class="language-javascript">//捏开80%,默认速度2500*density
node.pinchOpen(0.8)
//捏开80%,速度1000
node.pinchOpen(0.8,1000)
</code></pre>
<h2>滑动</h2>
<pre><code class="language-javascript">//向左滑动80%,默认速度2500*density
node.swipe(Direction.LEFT, 0.8)
//向右滑动
node.swipe(Direction.RIGHT, 0.8)
//向上滑动
node.swipe(Direction.UP, 0.8)
//向下滑动
node.swipe(Direction.DOWN, 0.8)
//向左滑动80%,速度1000
node.swipe(Direction.LEFT, 0.8,1000)
</code></pre>
</li>
</ul>
<h2>滚动手势</h2>
<pre><code class="language-javascript">//向左滚动80%,默认速度5000*density
node.scroll(Direction.LEFT,0.8)
//向左滚动80%,速度1000
node.scroll(Direction.LEFT,0.8,1000)
</code></pre>
<h2>快速滚动</h2>
<pre><code class="language-javascript">//快速向左滚动,默认速度7500*density
node.fling(Direction.LEFT)
//快速向左滚动,速度1000
node.fling(Direction.LEFT,1000)
</code></pre>
<h2>模拟按键输入文字(不支持汉字)</h2>
<p><code>node.legacySetText(&quot;text&quot;) </code></p>
<h2>节点输入文字</h2>
<p><code>node.setText(&quot;文字内容&quot;) </code></p>
<pre><code class="language-javascript">//输入文字
By.clazz('android.widget.EditText').setText(&quot;文字内容&quot;)
//第2个节点输入文字
By.clazz('android.widget.EditText').setText(&quot;文字内容&quot;,1)
</code></pre>