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

时间:2016-05-21 11:15:12

标签: android robotium ui-testing android-espresso

我已经决定使用Google的Espresso进行应用测试的测试标准之一是:

  

测试应在屏幕方向旋转后保持活动状态

使用Espresso时如何旋转屏幕?


我尝试了以下Robotium代码(是的,我在我的Espresso测试中放置了Robotium代码,所以起诉我)

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

但是当我在Espresso测试中运行它时,它会崩溃应用程序 有没有办法做到这一点?

提前感谢您提供任何帮助

6 个答案:

答案 0 :(得分:16)

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

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);

那是一块馅饼!

答案 1 :(得分:9)

你可以用uiautomator库

来做
Dim LastRow As Long

' get last row with data in Column A (don't skip blank cells in the middle)
LastRow = Sheet1.Range("A1").End(xlDown).Row
Email = Sheet1.Range("A" & LastRow).Value

ui automator需要min sdk版本18,因此如果您的应用具有较低的min sdk,则需要在dependencies { androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' } 文件夹中创建新的AndroidManifest.xml

androidTest

然后在你的测试中

<?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>

答案 2 :(得分:4)

more complete solution会创建自定义Espresso ViewAction并且运行良好。它显示了在调用Activity方法之前如何获取AppCompatActivity(即使它是setRequestedOrientation())。它还有一个干净的来电界面:

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

我按照100毫秒的延迟跟踪每个方向更改,但您可能不需要它。

答案 3 :(得分:3)

如何旋转屏幕:

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);
    }
}

可以从ActivityRule获取Activity

答案 4 :(得分:0)

您无法混合Robotium和Espresso测试。有时解决任何问题的最佳方法是检查所需但不可合并的方法的源代码。

我很确定你已经有setUp()方法,其代码如下:

myActivity = this.getActivity();

使用此选项更改屏幕方向更改:

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

您可能还需要使用myActivity.getInstrumentation().waitForIdleSync();Thread.sleep(milliseconds);才能等待轮换结束,因为它是以异步方式执行的。第二种方法取决于仿真器/设备,因此明智地选择它。

希望有所帮助。

答案 5 :(得分:0)

在自己对方向的测试感到烦恼之后,我想补充一点,尽管从文档的角度来看,lelloman建议使用UiDevice是正确的-不幸的是,在某些情况下,它不能按预期工作。

我发现,在测试崩溃后,至少在API 23仿真器上旋转可能会停滞:

  1. 执行uiDevice.setOrientationLeft()
  2. 应用程序崩溃;
  3. 旋转被卡住;
    3.1强制通过UiDevice进行旋转,但是在测试结束时旋转回到错误的方向,直到您手动将旋转更改为“自动旋转”;
    3.2 uiDevice.unfreezeRotation()可以在测试运行时提供帮助,但是在测试结束后,旋转会返回错误的状态。

我在API 28上没有这个问题。

所以我发现使用setRequestedOrientation是我唯一的解决方案。