当我们使用 appium 重新启动应用程序时,无法在 ios 11.2 中限制应用程序重置数据

Posted

技术标签:

【中文标题】当我们使用 appium 重新启动应用程序时,无法在 ios 11.2 中限制应用程序重置数据【英文标题】:unable to restrict app resetting data in ios 11.2 when we relaunch app using appium 【发布时间】:2018-01-30 09:29:30 【问题描述】:

我需要关闭应用程序并在我关闭它的相同位置重新启动它,因为这是使用 closeApp 和 launchApp 方法。但是当我启动应用程序时,它会从头开始启动应用程序。我尝试使用 noReset 和 fullReset 选项。我在 iPhone 7 模拟器上使用 appium 1.2.7 和 ios 11.2。在 android 中我可以使用 noReset 来实现这一点,这在 ios 中是否可行。

谁能推荐一下?

提前致谢。

【问题讨论】:

appium 服务器版本 1.7.1,appium 桌面版本 1.2.7 【参考方案1】:

做你想做的事情的唯一方法是保存你的 session_id,当你启动一个新测试时,你会从之前执行的测试的终点开始......

你要做的就是重写 Appium 的构造函数和 start_session:

Python 类代码

class MyWebDriverAppium(webdriver.Remote):    

def __init__(self, context, command_executor='http://127.0.0.1:4444/wd/hub',
             desired_capabilities=None, session_id=None):
    self.cCore = context
    try:
        self.preserved_session_id = session_id          
        self.error_handler = MobileErrorHandler()
        self._switch_to = MobileSwitchTo(self)

        # add new method to the `find_by_*` pantheon
        By.IOS_UIAUTOMATION = MobileBy.IOS_UIAUTOMATION
        By.IOS_PREDICATE = MobileBy.IOS_PREDICATE
        By.ANDROID_UIAUTOMATOR = MobileBy.ANDROID_UIAUTOMATOR
        By.ACCESSIBILITY_ID = MobileBy.ACCESSIBILITY_ID
        super(MyWebDriverAppium, self).__init__(command_executor, desired_capabilities)
    except Exception:
        print(traceback.format_exc())
        raise MyWebDriverAppiumInit("Error initializing Appium driver")

# If preserved_session is None we will start a new session as normal
# If preserved session is not None we will use that session to execute
def start_session(self, desired_capabilities, browser_profile=None):        
    try:            
        if self.preserved_session_id:            
            self.command_executor._commands['getSession'] = ('GET', '/session/$sessionId')
            self.session_id = self.preserved_session_id
            response = self.execute('getSession', 'sessionId ': self.session_id)            
            self.session_id = response['sessionId']
            self.capabilities = response['value']
            self.w3c = response['status']
        else:
            super(MyWebDriverAppium, self).start_session(desired_capabilities, browser_profile)
    except Exception:
        raise MyWebDriverAppiumStart("Error starting Appium driver after initialization")

Python 实现代码

self.driver = MyWebDriverAppium(self, self.driver_context, self.desired_caps, session_id)

Java 类代码

public class MyWebDriverAppium extends RemoteWebDriver 

    private String preserved_session_id = null;

    public MyWebDriverAppium(URL remoteAddress, Capabilities desiredCapabilities, String session_id) 
        super(remoteAddress, desiredCapabilities);
        this.preserved_session_id = session_id;
    

    @Override
    protected void startSession(Capabilities desiredCapabilities) 
        if(this.preserved_session_id != null)
            setSessionId(this.preserved_session_id);
        
        super.startSession(desiredCapabilities);
    

Java 实现代码

driver = new MyWebDriverAppium<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities, session_id);

我知道 Python 代码可以完美运行,因为它是我在测试中每次都使用的代码。我不是 100% 确定 Java 代码会完美运行,因为我没有使用 IDE。

希望对你有帮助

【讨论】:

以上是关于当我们使用 appium 重新启动应用程序时,无法在 ios 11.2 中限制应用程序重置数据的主要内容,如果未能解决你的问题,请参考以下文章

appium启动APP时避免重新安装的问题

Appium 未知错误:处理命令时发生未知的服务器端错误。原始错误:重新安装需要“应用程序”选项

Appium无法启动

出现“使用当前位置”权限弹出窗口时,Appium 和 Selenium 无法连接

Chrome 浏览器无法使用 Java 在 Appium 中启动

无法从 Appium 桌面应用程序启动应用程序。 apksigner 执行期间出错