环境:
Appium: 1.4.16
selenium: 2.52.0
安卓版本 5.1.1
测试app:官方selendroid-test-app.apk
官方 selendroid-test-app.apk
对该 App 测试官方代码样例在地址
官方混合应用文档说明:指导说明
我修改后的代码:
PLATFORM_VERSION = '5.1.1'
class AndroidWebViewTests(unittest.TestCase):
def setUp(self):
app = os.path.abspath(
os.path.join(os.path.dirname(__file__),
'../../apps/selendroid-test-app.apk'))
desired_caps = {
'app': app,
'appPackage': 'io.selendroid.testapp',
'appActivity': '.HomeScreenActivity',
'platformName': 'Android',
'platformVersion': PLATFORM_VERSION,
'deviceName': 'emulator-22'
}
if (PLATFORM_VERSION != '4.4'):
desired_caps['automationName'] = 'selendroid'
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_webview(self):
if (PLATFORM_VERSION == '4.4'):
button = self.driver.find_element_by_accessibility_id('buttonStartWebviewCD')
else:
button = self.driver.find_element_by_name('buttonStartWebviewCD')
button.click()
sleep(2)
self.driver.switch_to.context('WEBVIEW_0') # NATIVE_APP
print self.driver.page_source
input_field = self.driver.find_element_by_id('name_input')
sleep(1)
# input_field.click()
sleep(1)
input_field.clear()
# error due to clear method
input_field.send_keys('Appium User')
input_field.submit()
日志记录:
Device launched! Ready for commands
info: [debug] Setting command timeout to the default of 60 secs
info: [debug] Appium session started with sessionId 255aebc2-5b02-a65b-1277-4a75e57bcab0
info: <-- POST /wd/hub/session 303 9829.718 ms - 74
info: --> GET /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0 {}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0","method":"GET"}
info: [debug] Proxied response received with status 200: {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","status":0,"value":{"warnings":{},"desired":{"deviceName":"emulator-22","automationName":"selendroid","appActivity":".HomeScreenActivity","platformVersion":"5.1.1","appPackage":"io.selendroid.testapp","platformName":"Android","app":"/home/r00t/android_sample_code/sample-code-master/sample-code/apps/selendroid-test-app.apk"},"deviceName":"emulator-22","automationName":"selendroid","appActivity":".HomeScreenActivity","platformVersion":"22","appPackage":"io.selendroid.testapp","platformName":"android","app":"/home/r00t/android_sample_code/sample-code-master/sample-code/apps/selendroid-test-app.apk","takesScreenshot":true,"browserName":"selendroid","rotatable":true,"platform":"android","handlesAlerts":true,"javascriptEnabled":true,"networkConnectionEnabled":true,"version":"0.17.0","acceptSslCerts":true}}
info: <-- GET /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0 200 40.246 ms - 863
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element {"using":"name","sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","value":"buttonStartWebviewCD"}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element","method":"POST","json":{"using":"name","sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","value":"buttonStartWebviewCD"}}
info: [debug] Proxied response received with status 200: {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","status":0,"value":{"ELEMENT":"73d3f5e2-b3cd-e1bf-202b-e8c6067f3566"}}
info: <-- POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element 200 35.439 ms - 122
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/73d3f5e2-b3cd-e1bf-202b-e8c6067f3566/click {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","id":"73d3f5e2-b3cd-e1bf-202b-e8c6067f3566"}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/73d3f5e2-b3cd-e1bf-202b-e8c6067f3566/click","method":"POST","json":{"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","id":"73d3f5e2-b3cd-e1bf-202b-e8c6067f3566"}}
info: [debug] [SELENDROID] HTTP Server started on port 4450
info: [debug] Proxied response received with status 200: {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","status":0,"value":""}
info: <-- POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/73d3f5e2-b3cd-e1bf-202b-e8c6067f3566/click 200 645.889 ms - 74
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: [debug] [SELENDROID] setSystemUiVisibility vis=0 mask=1 oldVal=0 newVal=0 diff=0
info: [debug] [SELENDROID] [CDS]close[4450]
info: [debug] [SELENDROID] 1456806721463, io.selendroid.testapp/isExcluded = false/isTopTaskHome = true/isFirstValidTask = true/t.id = 822
info: [debug] [SELENDROID] 1456806367861, com.github.shadowsocks/isExcluded = false/isTopTaskHome = true/isFirstValidTask = false/t.id = 815
info: [debug] [SELENDROID] 1456805995827, com.mediatek.data/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456796856891, io.appium.unlock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = 798
info: [debug] [SELENDROID] 1456787722406, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456786824199, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456759960451, com.mediatek.op01.plugin/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456725925274, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456701313411, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456700625750, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456639510090, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456614921167, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456614037116, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456527632593, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456441228169, com.android.deskclock/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: [debug] [SELENDROID] 1456419952134, com.android.packageinstaller/isExcluded = true/isTopTaskHome = true/isFirstValidTask = false/t.id = -1
info: --> POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/context {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","name":"WEBVIEW_0"}
info: [debug] Getting a list of available webviews
info: [debug] executing cmd: /home/r00t/software/sdk/platform-tools/adb -s ZTEQ519T shell "cat /proc/net/unix"
info: [debug] Available contexts: undefined
info: [debug] []
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/window_handles","method":"GET"}
info: [debug] Available contexts: ["WEBVIEW_0","NATIVE_APP"]
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/context","method":"POST","json":{"name":"WEBVIEW_0"}}
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: [debug] Responding to client with success: {"status":0,"value":null,"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0"}
info: <-- POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/context 200 216.166 ms - 76 {"status":0,"value":null,"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0"}
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> GET /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/source {}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/source","method":"GET"}
info: [debug] Proxied response received with status 200: {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","status":0,"value":"<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Say Hello Demo</title></head><body>Hello, can you please tell me your name?<form name=\"myform\" action=\"http://localhost:4450/sayhello\" method=\"get\"><div align=\"center\"><br /><br /><input type=\"text\" id=\"name_input\" name=\"name\" size=\"25\" value=\"Enter your name here!\" /><br /><p>Prefered Car:<br /><select name=\"car\"><option value=\"volvo\">Volvo</option><option value=\"mercedes\">Mercedes</option><option value=\"audi\">Audi</option></select></p><br /><input type=\"submit\" value=\"Send me your name!\" /><br /></div></form></body></html>"}
info: <-- GET /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/source 200 248.182 ms - 692
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element {"using":"id","sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","value":"name_input"}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element","method":"POST","json":{"using":"id","sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","value":"name_input"}}
info: [debug] Proxied response received with status 200: {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","status":0,"value":{"ELEMENT":":wdc:1456806724295"}}
info: <-- POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element 200 93.817 ms - 104
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/:wdc:1456806724295/click {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","id":":wdc:1456806724295"}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/:wdc:1456806724295/click","method":"POST","json":{"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","id":":wdc:1456806724295"}}
info: [debug] [SELENDROID] [CMCC Performance test][SystemUI][Statusbar] show signal end [391214664]
info: [debug] [SELENDROID] isEmailSend:POST
info: [debug] [SELENDROID] getAllHeaders:POST
info: [debug] [SELENDROID] test:Content-Type:application/x-www-form-urlencoded
info: [debug] [SELENDROID] test:Accept:*/*
info: [debug] [SELENDROID] test:Accept-Encoding:gzip
info: [debug] [SELENDROID] httpHeader:null
info: [debug] [SELENDROID] this.mCheckHandler:android.net.Proxy$DefaultHttpRequestCheckHandler@3397d2ef
info: [debug] [SELENDROID] [CDS][DNS] getAllByNameImpl netId = 0
info: [debug] [SELENDROID ERR] java.util.concurrent.TimeoutException
info: [debug] [SELENDROID ERR] at java.util.concurrent.FutureTask.get(FutureTask.java:176)
info: [debug] [SELENDROID ERR] at avg.run(SogouSource:653)
info: [debug] [SELENDROID ERR] at java.lang.Thread.run(Thread.java:818)
info: [debug] Proxied response received with status 200: {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","status":0,"value":""}
info: <-- POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/:wdc:1456806724295/click 200 989.412 ms - 74
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/:wdc:1456806724295/clear {"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","id":":wdc:1456806724295"}
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/:wdc:1456806724295/clear","method":"POST","json":{"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0","id":":wdc:1456806724295"}}
info: [debug] Responding to client with error: {"status":13,"value":{"message":"An unknown server-side error occurred while processing the command.","origValue":"CATCH_ALL: io.selendroid.server.common.exceptions.SelendroidException: {\"message\":\"Element is not currently interactable and may not be manipulated\"}\n\tat io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:214)\n\tat io.selendroid.server.model.SelendroidWebDriver.executeAtom(SelendroidWebDriver.java:181)\n\tat io.selendroid.server.model.AndroidWebElement.clear(AndroidWebElement.java:285)\n\tat io.selendroid.server.handler.ClearElement.safeHandle(ClearElement.java:36)\n\tat io.selendroid.server.handler.SafeRequestHandler.handle(SafeRequestHandler.java:86)\n\tat io.selendroid.server.AndroidServlet.handleRequest(AndroidServlet.java:264)\n\tat io.selendroid.server.common.BaseServlet.handleHttpRequest(BaseServlet.java:67)\n\tat io.selendroid.server.common.http.ServerHandler.channelRead(ServerHandler.java:53)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)\n\tat io.netty.handler.traffic.AbstractTrafficShapingHandler.channelRead(AbstractTrafficShapingHandler.java:223)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)\n\tat io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)\n\tat io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163)\n\tat io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:148)\n\tat io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)\n\tat io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)\n\tat io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)\n\tat io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:430)\n\tat io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:384)\n\tat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)\n\tat io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)\n\tat io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)\n\tat java.lang.Thread.run(Thread.java:818)\n"},"sessionId":"255aebc2-5b02-a65b-1277-4a75e57bcab0"}
info: <-- POST /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0/element/:wdc:1456806724295/clear 500 205.145 ms - 3083
info: [debug] [SELENDROID] [CDS]close[8080]
info: [debug] [SELENDROID] close [socket][/127.0.0.1:8080]
info: --> DELETE /wd/hub/session/255aebc2-5b02-a65b-1277-4a75e57bcab0 {}
info: Shutting down appium session
切到 web 视图后 driver.page_source 输出为:
<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Say Hello Demo</title></head><body>Hello, can you please tell me your name?<form name=\"myform\" action=\"http://localhost:4450/sayhello\" method=\"get\"><div align=\"center\"><br /><br /><input type=\"text\" id=\"name_input\" name=\"name\" size=\"25\" value=\"Enter your name here!\" /><br /><p>Prefered Car:<br /><select name=\"car\"><option value=\"volvo\">Volvo</option><option value=\"mercedes\">Mercedes</option><option value=\"audi\">Audi</option></select></p><br /><input type=\"submit\" value=\"Send me your name!\" /><br /></div></form></body></html>
从 driver.page_source 结果中,可以看出 web 视图中具有 id 值为 name_input 的表单(value="Enter your name here!"),而且可以定位到该元素,为什么说可以定位到该元素,因为,把调用 clear 的代码
input_field.clear()
注释掉后测试就正常了。那么,如何解决调用 clear 方法清理表单值的异常?