【问题标题】:Chrome is crashing while image upload using selenium, How to fix it?使用 selenium 上传图片时 Chrome 崩溃,如何解决?
【发布时间】:2019-04-02 11:19:30
【问题描述】:

我正在使用 selenium 和 appium 来自动化 Android 手机上的移动 chrome 浏览器。 我已经通过

连接了真正的android设备

adb connect {手机的ip地址}

真机安卓chrome浏览器上的所有其他测试用例都运行成功。但是对于图片上传,浏览器崩溃了。

我正在使用以下代码上传图片

 public class UploadPhotoPage extends TestBase {

    // Page Factory Object Repository
    @FindBy(id = "file-upload")
    WebElement fileUpload;

    // Initialising the page object
    public UploadPhotoPage() {
    PageFactory.initElements(driver, this);
    }

    // Actions
    public void uploadphotos(String imagePath) throws AWTException, InterruptedException {
    fileUpload.sendKeys(imagePath);
    }
}

图像路径在appium server和eclipse执行测试用例的windows机器上。

这里有什么问题?

appium 服务器上的错误日志:

[W3C] 驱动代理激活,通过 HTTP 代理传递请求 [JSONWP 代理] 匹配 '/wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text' 到命令名称 'getText' [JSONWP 代理] 代理 [GET /wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text] 到 [GET http://127.0.0.1:8003/wd/hub/session/adb1415c77099095355e619b36dc5e1e/element/0.6272871137575717-18/text] with body: {} [JSONWP 代理] 得到状态 200 的响应:"{\"sessionId\":\"adb1415c77099095355e619b36dc5e1e\",\"status\":10,\"value\":{\"message\":\"stale element reference : 元素未附加到页面文档\n (会话信息: chrome=70.0.3538.64)\n (驱动程序信息: chromedriver=2.42.591088 (7b2b2dca23cca0862f674758c9a3933e685c27d5),platform=Windows NT 6.1.7601 SP1 x86_64)\"}} " [W3C] 运行命令时遇到内部错误:ProxyRequestError:无法将命令代理到远程服务器。原始错误:对 /wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text 的请求失败 [W3C] 在 JWProxy.proxy$ (C:\Users\chintamanim\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\jsonwp-proxy\proxy.js: 182:13) [W3C] 在 tryCatch (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40) [W3C] 在 GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:315:22 ) [W3C] 在 GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime. js:100:21) [W3C] 在 GeneratorFunctionPrototype.invoke (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:37) [W3C] 在 [MJSONWP] 将 JSONWP 错误代码 10 与 StaleElementReferenceError 匹配 [HTTP] GET /wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text [HTTP] {} [W3C] 驱动代理激活,通过 HTTP 代理传递请求 [JSONWP 代理] 匹配 '/wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text' 到命令名称 'getText' [JSONWP 代理] 代理 [GET /wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text] 到 [GET http://127.0.0.1:8003/wd/hub/session/adb1415c77099095355e619b36dc5e1e/element/0.6272871137575717-18/text] with body: {} [JSONWP 代理] 得到状态 200 的响应:"{\"sessionId\":\"adb1415c77099095355e619b36dc5e1e\",\"status\":10,\"value\":{\"message\":\"stale element reference : 元素未附加到页面文档\n (会话信息: chrome=70.0.3538.64)\n (驱动程序信息: chromedriver=2.42.591088 (7b2b2dca23cca0862f674758c9a3933e685c27d5),platform=Windows NT 6.1.7601 SP1 x86_64)\"}} " [W3C] 运行命令时遇到内部错误:ProxyRequestError:无法将命令代理到远程服务器。原始错误:对 /wd/hub/session/34e405a5-1bad-4711-9e1c-956e2d7391f6/element/0.6272871137575717-18/text 的请求失败 [W3C] 在 JWProxy.proxy$ (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-base-driver\lib\jsonwp-proxy\proxy.js: 182:13) [W3C] 在 tryCatch (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40) [W3C] 在 GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:315:22 ) [W3C] 在 GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime. js:100:21) [W3C] 在 GeneratorFunctionPrototype.invoke (C:\Users\chints\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:37) [W3C] 在 [MJSONWP] 将 JSONWP 错误代码 10 与 StaleElementReferenceError 匹配 [HTTP]

以下是我设置的功能

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability("deviceName", "ONEPLUS A5010");
        capabilities.setCapability("platformVersion", "8.1.0");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("browserName", "Chrome");
        capabilities.setCapability("deviceId", "XXX.XX.XX.XXX:5555");
        capabilities.setCapability("autoGrantPermissions", true);

【问题讨论】:

  • 您需要在原始帖子中显示更多代码。您展示了声明(但不初始化)一个 webelement 和一个 sendkeys 但没有别的。陈旧的元素消息通常意味着自上次为元素分配值以来 Web 文档已更改。如果您也包含 HTML 代码的 sn-p 可能会有所帮助。
  • 感谢先生的评论。我已根据您的建议编辑了帖子。
  • 除了可能将 AppiumFieldDecorator 添加到您的页面初始化以能够定义超时之外,我建议您在尝试调用您的 uploadphotos 方法之前立即创建一个新的页面对象 - 换句话说,我假设您已经创建了一个实例并且在调用该方法之前正在做其他事情,但是有些事情正在发生变化并且要解决一个过时的元素,请重新创建页面对象本身,然后调用您的 uploadphotos。
  • 再想一想,你的不是原生应用,而是浏览器,所以你想使用 AjaxElementLocatorFactory 之类的东西而不是 AppiumFieldDecorator
  • @BillHileman 您关于创建新页面对象的建议有助于消除陈旧元素异常。但这不是上传图片问题的根本原因。由于日志,我们混合了两个问题。感谢您的帮助。

标签: java selenium appium appium-android


【解决方案1】:

处理StaleElementException 的一个快速解决方案是在遇到Exception 时再次在DOM 中找到相同的元素WebElement

 public class UploadPhotoPage extends TestBase {

// Page Factory Object Repository
@FindBy(id = "file-upload")
WebElement fileUpload;

// Initialising the page object
public UploadPhotoPage() {
PageFactory.initElements(driver, this);
}

// Actions
public void uploadphotos(String imagePath) throws AWTException, InterruptedException {
try {
fileUpload.sendKeys(imagePath);
}
catch(StaleElementException ste){
driver.findElement(By.id("file-upload")).sendKeys(imagePath);
}
    }
}

【讨论】:

    【解决方案2】:

    我的脚本的问题如下 1)陈旧的元素问题是因为另一个元素,所以它不是根本原因。 2) 图片路径应为手机图片,不在桌面。这是一个大问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      相关资源
      最近更新 更多