Skip to content

Commit 4f572bc

Browse files
author
z
committed
Supports initializing poco using ip:port, and connecting to android:/// by default when the device is not connected.
1 parent 6cae21c commit 4f572bc

File tree

6 files changed

+66
-50
lines changed

6 files changed

+66
-50
lines changed

poco/drivers/android/uiautomation.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import threading
1010
import atexit
1111

12-
from airtest.core.api import connect_device, device as current_device
1312
from airtest.core.android.ime import YosemiteIme
1413
from airtest.core.error import AdbShellError, AirtestError
1514

@@ -22,6 +21,7 @@
2221
from poco.utils.hrpc.hierarchy import RemotePocoHierarchy
2322
from poco.utils.airtest.input import AirtestInput
2423
from poco.utils import six
24+
from poco.utils.device import default_device
2525
from poco.drivers.android.utils.installation import install, uninstall
2626

2727
__all__ = ['AndroidUiautomationPoco', 'AndroidUiautomationHelper']
@@ -150,9 +150,7 @@ def __init__(self, device=None, using_proxy=True, force_restart=False, use_airte
150150
if options.get('screenshot_each_action') is False:
151151
self.screenshot_each_action = False
152152

153-
self.device = device or current_device()
154-
if not self.device:
155-
self.device = connect_device("Android:///")
153+
self.device = device or default_device()
156154

157155
self.adb_client = self.device.adb
158156
if using_proxy:

poco/drivers/cocosjs/__init__.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from urlparse import urlparse
1818

1919
from airtest.core.api import connect_device, device as current_device
20+
from poco.utils.device import default_device
2021
from airtest.core.helper import device_platform
2122

2223

@@ -26,25 +27,23 @@
2627

2728

2829
class CocosJsPocoAgent(PocoAgent):
29-
def __init__(self, port, device=None):
30-
self.device = device or current_device()
31-
if not self.device:
32-
self.device = connect_device("Android:///")
33-
34-
platform_name = device_platform(self.device)
35-
if platform_name == 'Android':
36-
local_port, _ = self.device.adb.setup_forward('tcp:{}'.format(port))
37-
ip = self.device.adb.host or 'localhost'
38-
port = local_port
39-
elif platform_name == 'IOS':
40-
# Note: ios is now support for now.
41-
# ip = device.get_ip_address()
42-
# use iproxy first
43-
ip = 'localhost'
44-
local_port, _ = self.device.instruct_helper.setup_proxy(port)
45-
port = local_port
46-
else:
47-
ip = self.device.get_ip_address()
30+
def __init__(self, port, device=None, ip=None):
31+
if ip is None or ip == "localhost":
32+
self.device = device or default_device()
33+
34+
platform_name = device_platform(self.device)
35+
if platform_name == 'Android':
36+
local_port, _ = self.device.adb.setup_forward('tcp:{}'.format(port))
37+
ip = self.device.adb.host or 'localhost'
38+
port = local_port
39+
elif platform_name == 'IOS':
40+
port, _ = self.device.setup_forward(port)
41+
if self.device.is_local_device:
42+
ip = 'localhost'
43+
else:
44+
ip = self.device.ip
45+
else:
46+
ip = self.device.get_ip_address()
4847

4948
# transport
5049
self.conn = WebSocketClient('ws://{}:{}'.format(ip, port))
@@ -90,11 +89,12 @@ def __init__(self, addr=DEFAULT_ADDR, device=None, **options):
9089
port = urlparse(addr).port
9190
if not port:
9291
raise ValueError
92+
ip = urlparse(addr).hostname
9393
except ValueError:
9494
raise ValueError('Argument "addr" should be a tuple[2] or string format. e.g. '
9595
'["localhost", 5003] or "ws://localhost:5003". Got {}'.format(repr(addr)))
9696

97-
agent = CocosJsPocoAgent(port, device)
97+
agent = CocosJsPocoAgent(port, device, ip=ip)
9898
if 'action_interval' not in options:
9999
options['action_interval'] = 0.5
100100
super(CocosJsPoco, self).__init__(agent, **options)

poco/drivers/std/__init__.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from poco.utils.simplerpc.rpcclient import RpcClient
1212
from poco.utils.simplerpc.transport.tcp.main import TcpClient
1313
from poco.utils.simplerpc.utils import sync_wrapper
14+
from poco.utils.device import default_device
1415

1516
from airtest.core.api import connect_device, device as current_device
1617
from airtest.core.helper import device_platform
@@ -70,38 +71,41 @@ class StdPoco(Poco):
7071
device = connect_device('Android:///')
7172
poco = StdPoco(10054, device)
7273
74+
# or use ip:port to initialize poco object
75+
poco = StdPoco(port=10054, ip='xx.xx.xx.xx')
76+
7377
# now you can play with poco
7478
ui = poco('...')
7579
ui.click()
7680
...
7781
7882
"""
7983

80-
def __init__(self, port=DEFAULT_PORT, device=None, use_airtest_input=True, **kwargs):
81-
self.device = device or current_device()
82-
if not self.device:
83-
self.device = connect_device("Android:///")
84-
85-
platform_name = device_platform(self.device)
86-
if platform_name == 'Android':
87-
# always forward for android device to avoid network unreachable
88-
local_port, _ = self.device.adb.setup_forward('tcp:{}'.format(port))
89-
ip = self.device.adb.host or 'localhost'
90-
port = local_port
91-
elif platform_name == 'IOS':
92-
# ip = device.get_ip_address()
93-
# use iproxy first
94-
ip = 'localhost'
95-
port, _ = self.device.instruct_helper.setup_proxy(port)
96-
else:
97-
try:
98-
ip = self.device.get_ip_address()
99-
except AttributeError:
100-
try:
101-
ip = socket.gethostbyname(socket.gethostname())
102-
except socket.gaierror:
103-
# 某些特殊情况下会出现这个error,无法正确获取本机ip地址
84+
def __init__(self, port=DEFAULT_PORT, device=None, use_airtest_input=True, ip=None, **kwargs):
85+
if ip is None or ip == "localhost":
86+
self.device = device or default_device()
87+
88+
platform_name = device_platform(self.device)
89+
if platform_name == 'Android':
90+
# always forward for android device to avoid network unreachable
91+
local_port, _ = self.device.adb.setup_forward('tcp:{}'.format(port))
92+
ip = self.device.adb.host or 'localhost'
93+
port = local_port
94+
elif platform_name == 'IOS':
95+
port, _ = self.device.setup_forward(port)
96+
if self.device.is_local_device:
10497
ip = 'localhost'
98+
else:
99+
ip = self.device.ip
100+
else:
101+
try:
102+
ip = self.device.get_ip_address()
103+
except AttributeError:
104+
try:
105+
ip = socket.gethostbyname(socket.gethostname())
106+
except socket.gaierror:
107+
# 某些特殊情况下会出现这个error,无法正确获取本机ip地址
108+
ip = 'localhost'
105109

106110
agent = StdPocoAgent((ip, port), use_airtest_input)
107111
kwargs['reevaluate_volatile_attributes'] = True

poco/drivers/ue4/ue4_poco.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ def __init__(self, addr=DEFAULT_ADDR, ue4_editor=False, connect_default_device=T
2323
if dev is None and connect_default_device and not current_device():
2424
dev = connect_device("Android:///")
2525

26-
super(UE4Poco, self).__init__(addr[1], dev, **options)
26+
super(UE4Poco, self).__init__(addr[1], dev, ip=addr[0], **options)

poco/drivers/unity3d/unity3d_poco.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,6 @@ def __init__(self, addr=DEFAULT_ADDR, unity_editor=False, connect_default_device
7777
# can apply auto detection in the future
7878
dev = connect_device("Android:///")
7979

80-
super(UnityPoco, self).__init__(addr[1], dev, **options)
80+
super(UnityPoco, self).__init__(addr[1], dev, ip=addr[0], **options)
8181
# If some devices fail to initialize, the UI tree cannot be obtained
8282
# self.vr = UnityVRSupport(self.agent.rpc)

poco/utils/device.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from __future__ import absolute_import
33

44
from airtest.core.device import Device
5+
from airtest.core.api import connect_device, device as current_device
6+
from airtest.core.error import NoDeviceError
57

68

79
class VirtualDevice(Device):
@@ -18,3 +20,15 @@ def get_current_resolution(self):
1820

1921
def get_ip_address(self):
2022
return self.ip
23+
24+
25+
def default_device():
26+
"""
27+
Get default device, if no device connected, connect to first android device.
28+
29+
:return:
30+
"""
31+
try:
32+
return current_device()
33+
except NoDeviceError:
34+
return connect_device('Android:///')

0 commit comments

Comments
 (0)