作为持续集成过程的一部分,如何截取屏幕截图并通过电子邮件发送?
How to take screenshots and send them by e-mail as part of a Continuous Integration process?
我正在开发一个 Android 库模块,它在 UI 方面是高度可定制的。如果能有一个脚本或某种自动过程来拍摄 运行 应用程序的屏幕截图,将它们连接起来并通过电子邮件发送,那将是非常好的 - 这样我就可以快速检查是否有某些更改与某些更改混淆了UI 组件 and/or 具有更新库 READ-ME 的最新资产。
知道如何执行此操作吗?
我目前的想法
到目前为止,我一直在考虑添加代码以编程方式获取 SS,将它们存储在一个临时文件夹中,并在收集完所有图像后,通过一些 REST API 将它们发送到服务器。我想知道是否有更好的方法。
我最终遵循了最初的想法:
- 根据 this 的回答,我实现了一个截屏的方法;
- 根据 this 的回答,我实现了 API JavaMail,无需用户交互即可发送电子邮件;
1和2的组合可以在我的util库中找到kotlin-components
最后,我实施了 UI 进入所需状态的测试,拍摄屏幕截图 - 将它们保存在外部 SD 卡上 - 最后一步,它将 SS 添加为电子邮件附件发送到我想要的任何地方:
@RunWith(AndroidJUnit4::class)
@LargeTest
class UITestSearchSamples {
companion object {
private val SCREENSHOTS_DIRECTORY = "search-interface"
private val TIME_OUT = 3000L
private val WAITING_TIME = 1000L
@get:ClassRule
var disableAnimationsRule = DisableAnimationsRule()
}
private var finished = false
@get:Rule
var mActivityRule = ActivityTestRule(ActivityHomepage::class.java)
private var mMonitor: Instrumentation.ActivityMonitor? = null
@Before
fun setup() {
setWaitingPolice()
mMonitor = getInstrumentation().addMonitor(ActivitySearch::class.java.name, null, false)
}
private fun performWaitingTime() {
val idlingResource = ElapsedTimeIdlingResource(WAITING_TIME)
Espresso.registerIdlingResources(idlingResource)
}
private fun setWaitingPolice() {
IdlingPolicies.setMasterPolicyTimeout(TIME_OUT, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(TIME_OUT, TimeUnit.MILLISECONDS);
}
@After
fun tearDown() {
closeSoftKeyboard()
performWaitingTime()
val activitySearch = getInstrumentation().waitForMonitorWithTimeout(mMonitor, TIME_OUT) as AppCompatActivity
activitySearch.takeScreenShot(location = DirectoryPath.EXTERNAL, path = SCREENSHOTS_DIRECTORY, openScreenShot = false, showToast = false)
activitySearch.finish()
if (finished) {
sendNotificationEmail(activitySearch)
}
}
private fun sendNotificationEmail(activitySearch: AppCompatActivity) {
try {
val sender = Sender("sender_email", "sender_password")
val email = Email(
"Hello world: SMTP Server from Android with Attachments",
"This is a sample e-mail sent via SMTP server from Android without the need of user interaction.",
mutableListOf("recipient_01", "recipient_02"),
File("${DirectoryPath.EXTERNAL.getValue(activitySearch)}/search-interface").listFiles()
)
activitySearch.sendEmail(sender, email)
} catch (e: Exception) {
Log.e("SENDER E-MAIL SLAVE", e.message, e)
}
}
@Test
fun launchSample01() {
onView(withId(R.id.btn_sample_01)).perform(click())
onView(withId(R.id.input)).perform(typeText("Diana"))
}
@Test
fun launchSample02() {
onView(withId(R.id.btn_sample_02)).perform(click())
onView(withId(R.id.input)).perform(typeText("Clark"))
}
@Test
fun launchSample03() {
onView(withId(R.id.btn_sample_03)).perform(click())
onView(withId(R.id.input)).perform(typeText("Diana"))
onView(withId(R.id.wrapper)).perform(click())
performWaitingTime()
onView(withId(R.id.input)).perform(typeText("a"))
finished = true
}
}
我正在开发一个 Android 库模块,它在 UI 方面是高度可定制的。如果能有一个脚本或某种自动过程来拍摄 运行 应用程序的屏幕截图,将它们连接起来并通过电子邮件发送,那将是非常好的 - 这样我就可以快速检查是否有某些更改与某些更改混淆了UI 组件 and/or 具有更新库 READ-ME 的最新资产。
知道如何执行此操作吗?
我目前的想法
到目前为止,我一直在考虑添加代码以编程方式获取 SS,将它们存储在一个临时文件夹中,并在收集完所有图像后,通过一些 REST API 将它们发送到服务器。我想知道是否有更好的方法。
我最终遵循了最初的想法:
- 根据 this 的回答,我实现了一个截屏的方法;
- 根据 this 的回答,我实现了 API JavaMail,无需用户交互即可发送电子邮件;
1和2的组合可以在我的util库中找到kotlin-components
最后,我实施了 UI 进入所需状态的测试,拍摄屏幕截图 - 将它们保存在外部 SD 卡上 - 最后一步,它将 SS 添加为电子邮件附件发送到我想要的任何地方:
@RunWith(AndroidJUnit4::class)
@LargeTest
class UITestSearchSamples {
companion object {
private val SCREENSHOTS_DIRECTORY = "search-interface"
private val TIME_OUT = 3000L
private val WAITING_TIME = 1000L
@get:ClassRule
var disableAnimationsRule = DisableAnimationsRule()
}
private var finished = false
@get:Rule
var mActivityRule = ActivityTestRule(ActivityHomepage::class.java)
private var mMonitor: Instrumentation.ActivityMonitor? = null
@Before
fun setup() {
setWaitingPolice()
mMonitor = getInstrumentation().addMonitor(ActivitySearch::class.java.name, null, false)
}
private fun performWaitingTime() {
val idlingResource = ElapsedTimeIdlingResource(WAITING_TIME)
Espresso.registerIdlingResources(idlingResource)
}
private fun setWaitingPolice() {
IdlingPolicies.setMasterPolicyTimeout(TIME_OUT, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(TIME_OUT, TimeUnit.MILLISECONDS);
}
@After
fun tearDown() {
closeSoftKeyboard()
performWaitingTime()
val activitySearch = getInstrumentation().waitForMonitorWithTimeout(mMonitor, TIME_OUT) as AppCompatActivity
activitySearch.takeScreenShot(location = DirectoryPath.EXTERNAL, path = SCREENSHOTS_DIRECTORY, openScreenShot = false, showToast = false)
activitySearch.finish()
if (finished) {
sendNotificationEmail(activitySearch)
}
}
private fun sendNotificationEmail(activitySearch: AppCompatActivity) {
try {
val sender = Sender("sender_email", "sender_password")
val email = Email(
"Hello world: SMTP Server from Android with Attachments",
"This is a sample e-mail sent via SMTP server from Android without the need of user interaction.",
mutableListOf("recipient_01", "recipient_02"),
File("${DirectoryPath.EXTERNAL.getValue(activitySearch)}/search-interface").listFiles()
)
activitySearch.sendEmail(sender, email)
} catch (e: Exception) {
Log.e("SENDER E-MAIL SLAVE", e.message, e)
}
}
@Test
fun launchSample01() {
onView(withId(R.id.btn_sample_01)).perform(click())
onView(withId(R.id.input)).perform(typeText("Diana"))
}
@Test
fun launchSample02() {
onView(withId(R.id.btn_sample_02)).perform(click())
onView(withId(R.id.input)).perform(typeText("Clark"))
}
@Test
fun launchSample03() {
onView(withId(R.id.btn_sample_03)).perform(click())
onView(withId(R.id.input)).perform(typeText("Diana"))
onView(withId(R.id.wrapper)).perform(click())
performWaitingTime()
onView(withId(R.id.input)).perform(typeText("a"))
finished = true
}
}