Фон
Я автоматизирую создание скриншотов своего приложения для Android, используя скриншот Fastlane. Однако поведение по умолчанию Screengrab.screenshot()
добавляет отметку времени к имени файла. Это нежелательно и даже неожиданно.
Эта проблема на Github предлагает расширить ScreenshotCallback
, чтобы удалить метку времени из имени файла. Я обнаружил, что поведение по умолчанию реализовано в FileWritingScreenshotCallback
, поэтому решил расширить его и переопределить getScreenshotFile()
:
class ScreenshotCallback extends FileWritingScreenshotCallback {
public ScreenshotCallback(Context appContext) {
super(appContext);
}
@Override
protected File getScreenshotFile(File screenshotDirectory, String screenshotName) {
return new File(screenshotDirectory, screenshotName);
}
}
Тогда мой тест JUnit для создания скриншотов выглядит так:
Код
main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
/>
<!-- Other stuff -->
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}
Screenshots.java
public class Screenshots {
@Rule
public ActivityScenarioRule<LiteActivity> activityRule = new ActivityScenarioRule<>(
MainActivity.class
);
private ScreenshotCallback screenshotCallback;
private UiAutomatorScreenshotStrategy screenshotStrategy;
@Before
public void setUp() throws UiObjectNotFoundException {
Instrumentation inst = InstrumentationRegistry.getInstrumentation();
Context context = inst.getTargetContext();
screenshotCallback = new ScreenshotCallback(context);
screenshotStrategy = new UiAutomatorScreenshotStrategy();
ActivityScenario<LiteActivity> scenario = activityRule.getScenario();
Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy());
}
@Test
public void takeScreenshot() {
onView(withId(R.id.toolbar)).check(matches(isDisplayed()));
Screengrab.screenshot("MainScreen", screenshotStrategy, screenshotCallback);
}
}
Когда я запускаю это с bundle exec fastlane screengrab
, я получаю следующий вывод:
[22:31:52]: $ adb.exe -s emulator-5554 pull /sdcard/com.example/screengrab/en-US/images/screenshots C:/Users/user-name/AppData/Local/Temp/d20210808-12584-jlogjl
ls: /sdcard/Android/data/com.example/files/screengrab/en-US/images/screenshots: No such file or directory
[22:31:53]: Exit status: 1
ls: /data/user/0/com.example/files/com.example/screengrab/en-US/images/screenshots: No such file or directory
[22:31:53]: Exit status: 1
ls: /data/data/com.example/files/com.example/screengrab/en-US/images/screenshots: No such file or directory
[22:31:53]: Exit status: 1
ls: /data/data/com.example/app_screengrab/en-US/images/screenshots: No such file or directory
[22:31:53]: Exit status: 1
ls: /data/data/com.example/screengrab/en-US/images/screenshots: No such file or directory
[22:31:53]: Exit status: 1
[22:31:53]: Screenshots copied to fastlane/metadata/android/en-US/images/phoneScreenshots
[22:31:53]: Make sure you've used Screengrab.screenshot() in your tests and that your expected tests are being run.
Почему ни один из моих снимков экрана не отображается на устройстве? Я не вижу явных ошибок в логарифме. Если я сделаю Screengrab.screenshot("MainScreen");
вместо Screengrab.screenshot("MainScreen", screenshotStrategy, screenshotCallback);
, файл скриншота будет скопирован в мою файловую систему разработки просто отлично. Что я могу сделать для дальнейшей отладки?
Это еще лучшее решение. Спасибо.
Кроме того, правильный синтаксис
Screengrabfile
:use_timestamp_suffix(false)
.А еще, похоже, не работает. Я все еще получаю файлы с суффиксами временных меток.
@Code-Apprentice Прикрепите файл скриншота, о котором идет речь, пожалуйста
Я изучаю это дальше. Я думаю, мне нужно обновить зависимость gradle.
@Code-Apprentice Какую версию библиотеки вы используете?
У меня было
androidTestImplementation 'tools.fastlane:screengrab:1.0.0'
. Похоже,2.0.0
— это текущая версия.@Code-Apprentice Последняя версия 2.1.0.