• 用个迭代把所有 webview 里面的 k, j 都打印出来,看看哪个 webview 可以找到。

  • 确定页面已经出现了"login_email"的元素?
    以前碰过,如果页面没有出现要点击的元素,报错和妳的是一样的
    An unknown server-side error occurred while processing the command. (WARNING: The server did not provide any stacktrace information)

    不过妳睡的时间够长的,20 秒。

  • #3 楼 @xuxu
    图形对比,是不是可以使用 sikulix 来解决?

  • #4 楼 @lihuazhang
    估计实用性不大,塞 sikuli 的话,像评分这种窗口应该处理不了,因为不知道什么时候出现,即无法预计窗口出现的时间。

    弄了

    1. Eclipse/Intellij IDEA + Maven + Java + TestNG + ReportNG + YAML; 2. 加入了失败时自动截图,在 ReportNG 里面加入了失败截图链接的 Log (主要在 Jenkins 上使用); 3. 根据网上某大神的指引,把 Element 独立成 Yaml 独立管理 (依赖开发的配合),把测试一些数据如测试帐户信息,测试失败时的错误提示独立成 Yaml 管理,减少 Appium Java 测试脚本的 Hard Code。 4. 加入 sikuli script 和 sikuli slides 的 api。 这东西挺好玩的,主要是 sikuli slides 可以使用 google presentation,不用在本地储存 PPTX 文件,直接获取在线的,还可以跑指定某个 slide。不过 sikuli slides 不支持 Mac 10.9,我邮件问过开发者,10 个月前就在解决这个问题,到现在还没解决,所以又加入了 sikuli script 的 api。

    有时间,分享下上面说的。

  • #4 楼 @lihuazhang
    唉,只会皮毛中的皮毛,差得远啊。

  • #2 楼 @lihuazhang
    我暂时用 sikuli 搞的,appium java 代码塞进 sikuli 的 api

  • 有没 iOS 方面的? 像点掉评分那个窗口的,Appium 抓不到的窗口

  • IOS7.0 滑屏有 bug ? at 2014年08月25日

    #3 楼 @ericlovetest
    scroll 是 javascriptexecutor 的

  • #2 楼 @xuxu 学习了

  • #2 楼 @umbrella1978
    谢谢提示。

  • 问题已解决,js 的脚本不能单纯地用 webdriver 方法处理。
    如下:
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("window.document.getElementById('login_button').click()");

  • #2 楼 @umbrella1978
    是的,是通过 js 绑定事件来做业务动作,刚才找了开发的,看了下 js 源码,这个绑定的 js 动作是 click 事件。

  • #1 楼 @qddegtya
    用 findelements 是想知道有没有其他的同名 element。
    是我的脚本写错了。

  • IOS7.0 滑屏有 bug ? at 2014年08月01日

    可以用 scroll

  • IOS7.0 滑屏有 bug ? at 2014年08月01日

    滑不了, intrusments 的 bug,apple 不修。

  • #3 楼 @kuroky
    有,MobileBy 方法返回的就是 By,可以把 appiumdriver 封装的 accessibilityid 方法拆出来。
    java MobileBy 源码:

    package io.appium.java_client;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.SearchContext;
    import org.openqa.selenium.WebElement;
    
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * Created by jonahss on 4/10/14.
     */
    public abstract class MobileBy extends By {
    
      public static By IosUIAutomation(final String uiautomationText) {
        if (uiautomationText == null) {
          throw new IllegalArgumentException("Must supply an iOS UIAutomation string");
        }
    
        return new ByIosUIAutomation(uiautomationText);
      }
    
      public static By AndroidUIAutomator(final String uiautomatorText) {
        if (uiautomatorText == null) {
          throw new IllegalArgumentException("Must supply an Android UIAutomator string");
        }
    
        return new ByAndroidUIAutomator(uiautomatorText);
      }
    
      public static By AccessibilityId(final String id) {
        if (id == null) {
          throw new IllegalArgumentException("Must supply a uiautomationText");
        }
    
        return new ByAccessibilityId(id);
      }
    
      public static class ByIosUIAutomation extends By implements Serializable {
    
        private final String automationText;
    
        public ByIosUIAutomation(String uiautomationText)   {
          automationText = uiautomationText;
        }
    
        @Override
        public List<WebElement> findElements(SearchContext context) {
          return ((FindsByIosUIAutomation) context).findElementsByIosUIAutomation(automationText);
        }
    
        @Override
        public WebElement findElement(SearchContext context) {
          return ((FindsByIosUIAutomation) context).findElementByIosUIAutomation(automationText);
        }
    
        @Override
        public String toString() {
          return "By.IosUIAutomation: " + automationText;
        }
      }
    
      public static class ByAndroidUIAutomator extends By implements Serializable {
    
        private final String automatorText;
    
        public ByAndroidUIAutomator(String uiautomatorText) {
          automatorText = uiautomatorText;
        }
    
        @Override
        public List<WebElement> findElements(SearchContext context) {
          return ((FindsByAndroidUIAutomator) context).findElementsByAndroidUIAutomator(automatorText);
        }
    
        @Override
        public WebElement findElement(SearchContext context) {
          return ((FindsByAndroidUIAutomator) context).findElementByAndroidUIAutomator(automatorText);
        }
    
        @Override
        public String toString() { return "By.AndroidUIAutomator: " + automatorText; }
      }
    
      public static class ByAccessibilityId extends By implements Serializable {
    
        private final String id;
    
        public ByAccessibilityId(String id)   {
          this.id = id;
        }
    
        @Override
        public List<WebElement> findElements(SearchContext context) {
          return ((FindsByAccessibilityId) context).findElementsByAccessibilityId(id);
        }
    
        @Override
        public WebElement findElement(SearchContext context) {
          return ((FindsByAccessibilityId) context).findElementByAccessibilityId(id);
        }
    
        @Override
        public String toString() {
          return "By.AccessibilityId: " + id;
        }
      }
    }
    
    
    
    
  • apply 中使用 By 可能可以解决,不要直接使用 WebDriver/AppiumDriver