android 如何轮换活动,我的意思是:使用Espresso?更改屏幕方向

liwlm1x9  于 2022-12-21  发布在  Android
关注(0)|答案(7)|浏览(161)

我已经决定,我的应用程序测试与谷歌的Espresso的测试标准之一是:
屏幕方向旋转后,测试应保持活动状态
使用Espresso咖啡时如何旋转屏幕?
我已经尝试了以下Robotium代码(是的,我把Robotium代码在我的咖啡测试,所以起诉我)

solo.setActivityOrientation(solo.LANDSCAPE);
solo.setActivityOrientation(solo.PORTRAIT);

但是当我在Espresso测试中运行它时,它会使应用程序崩溃。
有什么办法可以做到吗?

    • 提前感谢您的帮助**
8nuwlpux

8nuwlpux1#

如果测试用例中只有“活动”,则可以执行以下操作:

1.宣告你测试Rule

@Rule
public ActivityTestRule<TestActivity> mActivityTestRule = new ActivityTestRule<>(TestActivity.class);

2.获取Activity并应用屏幕旋转。

mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

那是一块馅饼!

z6psavjg

z6psavjg2#

您可以使用uiautomator库来完成此操作

dependencies {
  androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' 
}

用户界面自动化需要最小软件开发包版本18,因此如果您的应用具有较低的最小软件开发包,则需要在androidTest文件夹中创建新的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:tools="http://schemas.android.com/tools"
    package="your.package.name">
    <uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/>
</manifest>

然后在你的测试中

UiDevice device = UiDevice.getInstance(getInstrumentation());

device.setOrientationLeft();
device.setOrientationNatural();
device.setOrientationRight();
nfs0ujit

nfs0ujit3#

这个more complete solution创建了一个定制的Espresso ViewAction,并且运行良好。它展示了如何在调用setRequestedOrientation()方法之前获取Activity(即使它是AppCompatActivity)。它还有一个干净的调用者接口:

onView(isRoot()).perform(orientationLandscape()); 
onView(isRoot()).perform(orientationPortrait());

我会在每次方向改变后延迟100毫秒,尽管您可能不需要它。

falq053o

falq053o4#

如何旋转屏幕:

public static void rotateScreen(Activity activity) {
    final CountDownLatch countDownLatch = new CountDownLatch(1);
    final int orientation = InstrumentationRegistry.getTargetContext()
            .getResources()
            .getConfiguration()
            .orientation;
    final int newOrientation = (orientation == Configuration.ORIENTATION_PORTRAIT) ?
            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

    activity.setRequestedOrientation(newOrientation);

    getInstrumentation().waitForIdle(new Runnable() {
        @Override
        public void run() {
            countDownLatch.countDown();
        }
    });

    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        throw new RuntimeException("Screen rotation failed", e);
    }
}

Activity可以从ActivityRule获得。

jhiyze9q

jhiyze9q5#

你不能混合Robotium和Espresso测试。有时候解决任何问题的最好方法是检查所需但不兼容的方法的源代码。
我非常确定您已经有了setUp()方法,其代码如下:
myActivity = this.getActivity();
使用此选项更改屏幕方向更改:
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
您可能还需要使用myActivity.getInstrumentation().waitForIdleSync();Thread.sleep(milliseconds);来等待旋转结束,因为它是以异步方式执行的。第二种方法取决于模拟器/设备,因此请明智地选择它。
希望能有所帮助。

jjhzyzn0

jjhzyzn06#

在我自己测试了这个方向之后,我想补充一点,虽然从文档的Angular 来看,lelloman使用UiDevice的建议是正确的,但不幸的是,在某些情况下,它并没有像预期的那样工作。
我发现,至少在API 23模拟器上,测试崩溃后旋转可能会卡住:
1.执行uiDevice.setOrientationLeft()
1.应用程序崩溃;
1.旋转卡死;
3.1通过UiDevice强制旋转可以工作,但当测试结束时,旋转返回错误的旋转,直到您手动将旋转更改为“自动旋转”;
3.2 uiDevice.unfreezeRotation()在测试运行时有帮助,但在测试结束旋转回到错误位置后。
我在API 28上没有这个问题。
所以我发现使用setRequestedOrientation是我唯一的解决方案。

u0sqgete

u0sqgete7#

此外,如果您使用ActivityTestRule来访问您的Activity,documentation会声明此类已弃用,您最好使用ActivityScenarioRule。
您需要将与Activity的交互放在一个可运行的回调中,而不是直接访问Activity的属性。
因此,屏幕旋转示例可能如下所示:

@get:Rule
    val activityRule = ActivityScenarioRule(MainActivity::class.java)

    private fun rotate() {
        activityRule.scenario.onActivity {
            it.requestedOrientation =
                    ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE
        }
    }

不确定要使用的常量是否合适,但ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE(或USER_PORTRAIT)是对我有效的常量

相关问题