Appium自動化測試微信小程序driver.set_clipboard_text('Clipboard data')方法報錯
在使用Appium自動化測試微信小程序時,需要用到提前將內容設置到剪切板,但因為微信小程序大多無法用網(wǎng)頁打開,也就意味著它是WebView,而在WebView中Appium的一部分api將無法使用,包括設置剪切板內容driver.set_clipboard_text(),報錯內容如下:
raceback (most recent call last): File "D:\Code\FormAuto\app1.py", line 321, in <module> driver.set_clipboard_text("55566") File "D:\Code\FormAuto\venv\lib\site-packages\appium\webdriver\extensions\clipboard.py", line 61, in set_clipboard_text return self.set_clipboard(bytes(str(text), 'UTF-8'), ClipboardContentType.PLAINTEXT, label) File "D:\Code\FormAuto\venv\lib\site-packages\appium\webdriver\extensions\clipboard.py", line 48, in set_clipboard self.execute(Command.SET_CLIPBOARD, options) File "D:\Code\FormAuto\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 346, in execute self.error_handler.check_response(response) File "D:\Code\FormAuto\venv\lib\site-packages\appium\webdriver\errorhandler.py", line 122, in check_response raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace)) selenium.common.exceptions.UnknownMethodException: Message: Method has not yet been implemented Stacktrace: NotYetImplementedError: Method has not yet been implemented at AndroidUiautomator2Driver.executeCommand (D:\Node\node_global\node_modules\appium\node_modules\appium-base-driver\lib\basedriver\driver.js:328:13) at AppiumDriver.executeCommand (D:\Node\node_global\node_modules\appium\lib\appium.js:563:36) at runMicrotasks (<anonymous>) at processTicksAndRejections (node:internal/process/task_queues:96:5) at asyncHandler (D:\Node\node_global\node_modules\appium\node_modules\appium-base-driver\lib\protocol\protocol.js:297:21)
簡單來說,就是WebView不支持driver.set_clipboard_text()方法。
簡單來說,就是WebView不支持driver.set_clipboard_text()方法。
解決辦法有兩個:
1.用adb進行操作:
? ?command = f"adb shell input text {text}"
? ?os.system(command)
這個方法直接跨過了WebView和NATIVE_APP的限制,可以在任何應用上使用,但弊端是不支持中文,如果你需要剪切的內容沒有中文,那adb是最好的選擇,因為它通用性很廣,如果內容有中文,也可以通過uncode編碼來轉換,但會比較麻煩。
2.WebView和NATIVE_APP之間來回切換:
因為driver.set_clipboard_text()只是無法在.WebView中執(zhí)行,那我切回來剪切,弄完了在換回去,具體操作如下:
# 在 WebView 上下文中
driver.switch_to.context('WEBVIEW_1')
element = driver.find_element_by_css_selector('#form_field')
element.send_keys('Form data')
# 切換回 NATIVE_APP 上下文來設置剪貼板的文本
driver.switch_to.context('NATIVE_APP')
driver.set_clipboard_text('Clipboard data')
# 再次切換到 WebView 上下文來繼續(xù)
driver.switch_to.context('WEBVIEW_1')
other_element = driver.find_element_by_css_selector('#other_form_field')
other_element.send_keys('More form data')
該方法針對的是WebView應用,弊端是局限性較大。