Fastlane Screengrab — не включать временную метку в имена файлов снимков экрана.

avatar
Code-Apprentice
9 августа 2021 в 04:43
122
1
0

Фон

Я автоматизирую создание скриншотов своего приложения для 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);, файл скриншота будет скопирован в мою файловую систему разработки просто отлично. Что я могу сделать для дальнейшей отладки?

Источник

Ответы (1)

avatar
Leonid
9 августа 2021 в 06:16
2

Screengrab поддерживает это.

Вы должны найти файл Screengrabfile с конфигурацией и установить поле

use_timestamp_suffix: false

Документация

Объединенный запрос на вытягивание с этими изменениями

Code-Apprentice
9 августа 2021 в 06:54
0

Это еще лучшее решение. Спасибо.

Code-Apprentice
9 августа 2021 в 07:17
0

Кроме того, правильный синтаксис Screengrabfile: use_timestamp_suffix(false).

Code-Apprentice
9 августа 2021 в 07:21
0

А еще, похоже, не работает. Я все еще получаю файлы с суффиксами временных меток.

Leonid
9 августа 2021 в 07:24
0

@Code-Apprentice Прикрепите файл скриншота, о котором идет речь, пожалуйста

Code-Apprentice
9 августа 2021 в 07:28
0

Я изучаю это дальше. Я думаю, мне нужно обновить зависимость gradle.

Leonid
9 августа 2021 в 07:29
0

@Code-Apprentice Какую версию библиотеки вы используете?

Code-Apprentice
9 августа 2021 в 07:37
0

У меня было androidTestImplementation 'tools.fastlane:screengrab:1.0.0'. Похоже, 2.0.0 — это текущая версия.

Leonid
9 августа 2021 в 07:40
1

@Code-Apprentice Последняя версия 2.1.0.