保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

Android自动化测试技术Espresso的使用

  配置修改设置
  先启用开发者选项,再在开发者选项下,停用以下三项设置:窗口动画缩放过渡动画缩放Animator时长缩放添加依赖
  在appbuild。gradle文件中添加依赖androidTestImplementationandroidx。test。espresso:espressocore:3。2。0androidTestImplementationandroidx。test:runner:1。2。0androidTestImplementationandroidx。test:rules:1。2。0复制代码
  在appbuild。gradle文件中的android。defaultConfig中添加testInstrumentationRunnerandroidx。test。runner。AndroidJUnitRunner复制代码
  注意:上面的依赖只能实现基本功能,如果你想使用所有的功能,则按下面的配置:
  所有依赖androidTestImplementationandroidx。test。ext:junit:1。1。1androidTestImplementationandroidx。test。ext:truth:1。2。0androidTestImplementationandroidx。test。espresso:espressocore:3。2。0androidTestImplementationandroidx。test。espresso:espressocontrib:3。2。0androidTestImplementationandroidx。test:runner:1。2。0androidTestImplementationandroidx。test:rules:1。2。0androidTestImplementationandroidx。test。espresso:espressointents:3。2。0implementationandroidx。recyclerview:recyclerview:1。1。0implementationandroidx。test。espresso:espressoidlingresource:3。2。0复制代码
  下面调用的方法如onView()等都是静态方法,可以通过importstaticXXX来直接调用,所有需要导入的静态方法如下:importstaticandroidx。test。espresso。Espresso。;importstaticandroidx。test。espresso。action。ViewActions。;importstaticandroidx。test。espresso。assertion。ViewAssertions。;importstaticandroidx。test。espresso。intent。Intents。intended;importstaticandroidx。test。espresso。intent。Intents。intending;importstaticandroidx。test。espresso。intent。matcher。ComponentNameMatchers。;importstaticandroidx。test。espresso。intent。matcher。IntentMatchers。;importstaticandroidx。test。espresso。matcher。ViewMatchers。;importstaticandroidx。test。ext。truth。content。IntentSubject。assertThat;复制代码Api组件
  常用Api组件包括:Espresso用于与视图交互(通过onView()和onData())的入口点。此外,还公开不一定与任何视图相关联的API,如pressBack()。ViewMatchers实现Matcherlt;?superView接口的对象的集合。您可以将其中一个或多个对象传递给onView()方法,以在当前视图层次结构中找到某个视图。ViewActions可传递给ViewInteraction。perform()方法的ViewAction对象(如click())的集合。ViewAssertions可传递给ViewInteraction。check()方法的ViewAssertion对象的集合。在大多数情况下,您将使用matches断言,它使用视图匹配器断言当前选定视图的状态。
  大多数可用的Matcher、ViewAction和ViewAssertion实例如下图(来源官方文档):
  常用的api实例pdf使用普通控件
  示例:MainActivity包含一个Button和一个TextView。点击该按钮后,TextView的内容会变为改变成功。
  使用Espresso进行测试方法如下:RunWith(AndroidJUnit4。class)LargeTestpublicclassChangeTextTest{RulepublicActivityTestRuleMainActivityactivityRulenewActivityTestRule(MainActivity。class);Testpublicvoidtestchangetext(){onView(withId(R。id。change))。perform(click());onView(withId(R。id。content))。check(matches(withText(改变成功)));}}复制代码
  onView()方法用来获取匹配的当前视图,注意匹配的视图只能有一个,否则会报错。
  withId()方法用来搜索匹配的视图,类似的还有withText()、withHint()等。
  perform()方法用来执行某种操作,例如点击click()、长按longClick()、双击doubleClick()
  check()用来将断言应用于当前选定的视图
  matches()最常用的断言,它断言当前选定视图的状态。上面的示例就是断言id为content的View它是否和text为改变成功的View匹配AdapterView相关控件
  与普通控件不同,AdapterView(常用的是ListView)只能将一部分子视图加载到当前视图层次结构中。简单的onView()搜索将找不到当前未加载的视图。Espresso提供一个单独的onData()入口点,该入口点能够先加载相关适配器项目,并在对其或其任何子级执行操作之前使其处于聚焦状态。
  示例:打开Spinner,选择一个特定的条目,然后验证TextView是否包含该条目。Spinner会创建一个包含其内容的ListView,因此需要onData()RunWith(AndroidJUnit4。class)LargeTestpublicclassSpinnerTest{RulepublicActivityTestRuleMainActivityactivityRulenewActivityTestRule(MainActivity。class);Testpublicvoidtestspinner(){Stringcontent学校;点击Spnner,显示项目onView(withId(R。id。change))。perform(click());点击指定的内容onData(allOf(is(instanceOf(String。class)),is(content)))。perform(click());判断TextView是否包含指定内容onView(withId(R。id。content))。check(matches(withText(containsString(content))));}}复制代码
  下图为AdapterView的继承关系图:自定义Matcher和ViewAction
  在介绍RecyclerView的操作之前,我们先要看看如何自定义Matcher和ViewAction。自定义Matcher
  Matcher是一个用来匹配视图的接口,常用的是它的两个实现类BoundedMatcherT,SextendsT和TypeSafeMatcher
  BoundedMatcherT,SextendsT:一些匹配的语法糖,可以让你创建一个给定的类型,而匹配的特定亚型的只有过程项匹配。类型参数:匹配器的期望类型。T的亚型
  TypeSafeMatcher:内部实现了空检查,检查的类型,然后进行转换
  示例:输入EditText值,如果值以000开头,则让内容为成功的TextView可见,否则让内容为失败的TextView可见。RunWith(AndroidJUnit4。class)LargeTestpublicclassEditTextTest{RulepublicActivityTestRuleMainActivityactivityRulenewActivityTestRule(MainActivity。class);TestpublicvoidrightInput(){onView(withId(R。id。editText))。check(matches(EditMatcher。isRight()))。perform(typeText(000123),ViewActions。closeSoftKeyboard());onView(withId(R。id。button))。perform(click());onView(withId(R。id。textViewsuccess))。check(matches(isDisplayed()));onView(withId(R。id。textViewfail))。check(matches(not(isDisplayed())));}TestpublicvoiderrorInput(){onView(withId(R。id。editText))。check(matches(EditMatcher。isRight()))。perform(typeText(003),ViewActions。closeSoftKeyboard());onView(withId(R。id。button))。perform(click());onView(withId(R。id。textViewsuccess))。check(matches(not(isDisplayed())));onView(withId(R。id。textViewfail))。check(matches(isDisplayed()));}staticclassEditMatcher{staticMatcherViewisRight(){自定义MatcherreturnnewBoundedMatcherView,EditText(EditText。class){OverridepublicvoiddescribeTo(Descriptiondescription){description。appendText(EditText不满足要求);}OverrideprotectedbooleanmatchesSafely(EditTextitem){在输入EditText之前,先判EditText是否可见以及hint是否为指定值if(item。getVisibility()View。VISIBLEitem。getText()。toString()。isEmpty())returntrue;elsereturnfalse;}};}}}复制代码自定义ViewAction
  这个不太熟悉,这里就介绍一下实现ViewAction接口,要实现的方法的作用符合某种限制的视图publicMatcherViewgetConstraints();返回视图操作的描述。说明不应该过长,应该很好地适应于一句话publicStringgetDescription();执行给定的视图这个动作。PARAMS:uiController控制器使用与UI交互。view在采取行动的view。不能为nullpublicvoidperform(UiControlleruiController,Viewview);}复制代码RecyclerView
  RecyclerView对象的工作方式与AdapterView对象不同,因此不能使用onData()方法与其交互。要使用Espresso与RecyclerView交互,您可以使用espressocontrib软件包,该软件包具有RecyclerViewActions的集合,定义了用于滚动到相应位置或对项目执行操作的方法。
  添加依赖androidTestImplementationandroidx。test。espresso:espressocontrib:3。2。0复制代码
  操作RecyclerView的方法有:scrollTo()滚动到匹配的视图。scrollToHolder()滚动到匹配的视图持有者。scrollToPosition()滚动到特定位置。actionOnHolderItem()对匹配的视图持有者执行视图操作。actionOnItem()对匹配的视图执行视图操作。actionOnItemAtPosition()在特定位置对视图执行视图操作。
  示例:选中删除功能:点击编辑,TextView内容转为删除,同时RecycleView的条目出现选中框,勾选要删除的项,点击删除,删除指定项,RecycleView的条目的选中框消失。RunWith(AndroidJUnit4。class)LargeTestpublicclassRecyclerViewTest{RulepublicActivityTestRuleRecyclerActivityactivityRulenewActivityTestRule(RecyclerActivity。class);staticclassClickCheckBoxActionimplementsViewAction{OverridepublicMatcherViewgetConstraints(){returnany(View。class);}OverridepublicStringgetDescription(){returnnull;}Overridepublicvoidperform(UiControlleruiController,Viewview){CheckBoxboxview。findViewById(R。id。checkbox);box。performClick();点击}}staticclassMatcherDataActionimplementsViewAction{privateStringrequire;publicMatcherDataAction(Stringrequire){this。requirerequire;}OverridepublicMatcherViewgetConstraints(){returnany(View。class);}OverridepublicStringgetDescription(){returnnull;}Overridepublicvoidperform(UiControlleruiController,Viewview){TextViewtextview。findViewById(R。id。text);assertThat(数据值不匹配,require,equalTo(text。getText()。toString()));}}publicvoiddeleterequiredata(){获取RecyclerView中显示的所有数据ListStringlnewArrayList(activityRule。getActivity()。getData());点击编辑,判断text是否变成删除onView(withId(R。id。edit))。perform(click())。check(matches(withText(删除)));用来记录要删除的项,RandomrandomnewRandom();inttimerandom。nextInt(COUNT);ListStringdatanewArrayList(COUNT);for(inti0;iCOUNT;i){data。add();}for(inti0;itime;i){随机生成要删除的位置intpositionrandom。nextInt(COUNT);由于再次点击会取消,这里用来记录最后确定要删除的项if(data。get(position)。equals())data。set(position,测试数据position);elsedata。set(position,);调用RecyclerViewActions。actionOnItemAtPosition()方法,滑到指定位置在执行指定操作onView(withId(R。id。recycler))。perform(RecyclerViewActions。actionOnItemAtPosition(position,newClickCheckBoxAction()));}点击删除,判断text是否变成编辑onView(withId(R。id。edit))。perform(click(),doubleClick())。check(matches(withText(编辑)));删除无用的项data。removeIf(ss。equals());获取最后保存的项l。removeAll(data);依次判断保留的项是否还存在for(inti0;il。size();i){finalStringrequirel。get(i);onView(withId(R。id。recycler))。perform(RecyclerViewActions。actionOnItemAtPosition(i,newMatcherDataAction(require)));}}}复制代码
  注意:在MatcherDataAction中调用了assertThat(),这种方式是不建议的。这里是我没有找到更好的方式来实现这个测试。Intent
  EspressoIntents是Espresso的扩展,支持对被测应用发出的Intent进行验证和打桩。
  添加依赖:androidTestImplementationandroidx。test。ext:truth:1。2。0androidTestImplementationandroidx。test。espresso:espressointents:3。2。0复制代码
  在编写EspressoIntents测试之前,要先设置IntentsTestRule。这是ActivityTestRule类的扩展,可让您在功能界面测试中轻松使用EspressoIntents的API。IntentsTestRule会在带有Test注解的每个测试运行前初始化EspressoIntents,并在每个测试运行后释放EspressoIntents。RulepublicIntentsTestRuleMainActivitymActivityRulenewIntentsTestRule(MainActivity。class);复制代码验证Intent
  示例:在EditText中,输入电话号码,点击拨打按键,拨打电话。RunWith(AndroidJUnit4。class)LargeTestpublicclassIntentTest{设置拨打电话的权限的环境RulepublicGrantPermissionRulegrantPermissionRuleGrantPermissionRule。grant(android。permission。CALLPHONE);RulepublicIntentsTestRuleMainActivitymActivityRulenewIntentsTestRule(MainActivity。class);Testpublicvoidteststartotherappintent(){StringphoneNumber123456;输入电话号码onView(withId(R。id。phone))。perform(typeText(phoneNumber),ViewActions。closeSoftKeyboard());点击拨打onView(withId(R。id。button))。perform(click());验证Intent是否正确intended(allOf(hasAction(Intent。ACTIONCALL),hasData(Uri。parse(tel:phoneNumber))));}}复制代码
  intended():是EspressoIntents提供的用来验证Intent的方法
  除此之外,还可以通过断言的方式来验证IntentIntentreceivedIntentIterables。getOnlyElement(Intents。getIntents());assertThat(receivedIntent)。extras()。string(phone)。isEqualTo(phoneNumber);复制代码插桩
  上述方式可以解决一般的Intent验证的操作,但是当我们需要调用startActivityForResult()方法去启动照相机获取照片时,如果使用一般的方式,我们就需要手动去点击拍照,这样就不算自动化测试了。
  EspressoIntents提供了intending()方法来解决这个问题,它可以为使用startActivityForResult()启动的Activity提供桩响应。简单来说就是,它不会去启动照相机,而是返回你自己定义的Intent。RunWith(AndroidJUnit4。class)LargeTestpublicclassTakePictureTest{publicstaticBoundedMatcherView,ImageViewhasDrawable(){returnnewBoundedMatcherView,ImageView(ImageView。class){OverridepublicvoiddescribeTo(Descriptiondescription){description。appendText(hasdrawable);}OverridepublicbooleanmatchesSafely(ImageViewimageView){returnimageView。getDrawable()!null;}};}RulepublicIntentsTestRuleMainActivitymIntentsRulenewIntentsTestRule(MainActivity。class);RulepublicGrantPermissionRulegrantPermissionRuleGrantPermissionRule。grant(Manifest。permission。CAMERA);BeforepublicvoidstubCameraIntent(){Instrumentation。ActivityResultresultcreateImageCaptureActivityResultStub();intending(hasAction(MediaStore。ACTIONIMAGECAPTURE))。respondWith(result);}TestpublicvoidtakePhotodrawableIsApplied(){先检查ImageView中是否已经设置了图片onView(withId(R。id。image))。check(matches(not(hasDrawable())));点击拍照onView(withId(R。id。button))。perform(click());判断ImageView中是否已经设置了图片onView(withId(R。id。image))。check(matches(hasDrawable()));}privateInstrumentation。ActivityResultcreateImageCaptureActivityResultStub(){自己定义IntentBundlebundlenewBundle();bundle。putParcelable(data,BitmapFactory。decodeResource(mIntentsRule。getActivity()。getResources(),R。drawable。iclauncherround));IntentresultDatanewIntent();resultData。putExtras(bundle);returnnewInstrumentation。ActivityResult(Activity。RESULTOK,resultData);}}复制代码空闲资源
  空闲资源表示结果会影响界面测试中后续操作的异步操作。通过向Espresso注册空闲资源,可以在测试应用时更可靠地验证这些异步操作。
  添加依赖implementationandroidx。test。espresso:espressoidlingresource:3。2。0复制代码
  下面以Google的官方示例来介绍,如何使用:
  第一步:创建SimpleIdlingResource类,用来实现IdlingResourcepublicclassSimpleIdlingResourceimplementsIdlingResource{NullableprivatevolatileResourceCallbackmCallback;privateAtomicBooleanmIsIdleNownewAtomicBoolean(true);OverridepublicStringgetName(){returnthis。getClass()。getName();}false表示这里有正在进行的任务,而true表示异步任务完成OverridepublicbooleanisIdleNow(){returnmIsIdleNow。get();}OverridepublicvoidregisterIdleTransitionCallback(ResourceCallbackcallback){mCallbackcallback;}publicvoidsetIdleState(booleanisIdleNow){mIsIdleNow。set(isIdleNow);if(isIdleNowmCallback!null){调用这个方法后,Espresso不会再检查isIdleNow()的状态,直接判断异步任务完成mCallback。onTransitionToIdle();}}}复制代码
  第二步:创建执行异步任务的类MessageDelayerclassMessageDelayer{privatestaticfinalintDELAYMILLIS3000;interfaceDelayerCallback{voidonDone(Stringtext);}staticvoidprocessMessage(finalStringmessage,finalDelayerCallbackcallback,NullablefinalSimpleIdlingResourceidlingResource){if(idlingResource!null){idlingResource。setIdleState(false);}HandlerhandlernewHandler();newThread((){try{Thread。sleep(DELAYMILLIS);}catch(InterruptedExceptione){e。printStackTrace();}handler。post(newRunnable(){Overridepublicvoidrun(){if(callback!null){callback。onDone(message);if(idlingResource!null){idlingResource。setIdleState(true);}}}});})。start();}}复制代码
  第三步:在MainActivity中通过点击按钮开启任务publicclassMainActivityextendsAppCompatActivityimplementsView。OnClickListener,MessageDelayer。DelayerCallback{privateTextViewmTextView;privateEditTextmEditText;NullableprivateSimpleIdlingResourcemIdlingResource;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super。onCreate(savedInstanceState);setContentView(R。layout。activitymain);findViewById(R。id。changeTextBt)。setOnClickListener(this);mTextViewfindViewById(R。id。textToBeChanged);mEditTextfindViewById(R。id。editTextUserInput);}OverridepublicvoidonClick(Viewview){finalStringtextmEditText。getText()。toString();if(view。getId()R。id。changeTextBt){mTextView。setText(正在等待);MessageDelayer。processMessage(text,this,mIdlingResource);}}OverridepublicvoidonDone(Stringtext){mTextView。setText(text);}仅测试能调用,创建并返回新的SimpleIdlingResourceVisibleForTestingNonNullpublicIdlingResourcegetIdlingResource(){if(mIdlingResourcenull){mIdlingResourcenewSimpleIdlingResource();}returnmIdlingResource;}}复制代码
  第四步:创建测试用例RunWith(AndroidJUnit4。class)LargeTestpublicclassChangeTextBehaviorTest{privatestaticfinalStringSTRINGTOBETYPEDEspresso;privateIdlingResourcemIdlingResource;注册IdlingResource实例BeforepublicvoidregisterIdlingResource(){ActivityScenarioactivityScenarioActivityScenario。launch(MainActivity。class);activityScenario。onActivity((ActivityScenario。ActivityActionMainActivity)activity{mIdlingResourceactivity。getIdlingResource();IdlingRegistry。getInstance()。register(mIdlingResource);});}TestpublicvoidchangeTextsameActivity(){onView(withId(R。id。editTextUserInput))。perform(typeText(STRINGTOBETYPED),closeSoftKeyboard());onView(withId(R。id。changeTextBt))。perform(click());只需要注册IdlingResource实例,Espresso就会自动在这里等待,直到异步任务完成在执行下面的代码onView(withId(R。id。textToBeChanged))。check(matches(withText(STRINGTOBETYPED)));}取消注册AfterpublicvoidunregisterIdlingResource(){if(mIdlingResource!null){IdlingRegistry。getInstance()。unregister(mIdlingResource);}}}复制代码
  不足:Espresso提供了一套先进的同步功能。不过,该框架的这一特性仅适用于在MessageQueue上发布消息的操作,如在屏幕上绘制内容的View子类。其他
  Espresso还有在多进程、WebView、无障碍功能检查、多窗口等内容,这些我不太熟悉,建议自己看安卓官方文档或者下面的官方示例。官方示例IntentsBasicSample:intended()和intending()的基本用法。IdlingResourceSample:与后台作业同步。BasicSample:基本的Espresso示例。CustomMatcherSample:展示如何扩展Espresso以与EditText对象的hint属性匹配。DataAdapterSample:展示Espresso中适用于列表和AdapterView对象的onData()入口点。IntentsAdvancedSample:模拟用户使用相机获取位图。MultiWindowSample:展示如何将Espresso指向不同的窗口。RecyclerViewSample:Espresso的RecyclerView操作。WebBasicSample:使用EspressoWeb与WebView对象交互。
  作者:时代不变
  链接:https:juejin。cnpost6844904181111734279
  来源:稀土掘金
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

DateUtils日期工具类日期相差集合(可改写,比如两个时间段,相差年,月,日,时,分,秒)return集合数据privateListStringprocessDateBetweenHourList()……状物作文台历书架上放着一个台历。红色的底座,白色的纸页。第一页,印的是我在地球上最想去的地方埃菲尔铁塔。这是侧面的铁塔,边上绿树成荫,铁塔矗立在不远处,在阳光的照射下,呈现出金黄的色……技术GoogleMap干掉倾斜摄影了?相信这两天大家朋友圈都被GoogleMap新功能演示刷屏了,视频中介绍说GoogleMap将在一些城市实现实景渲染,在手机中能够就从不同视角能逼真地浏览城市场景,甚至还能实现从……燕儿的哭泣五年级作文叽叽叽,几声燕子叫划破了夜的宁静,原来是燕妈妈生下了两只可爱的小燕,大的叫同同,小的叫红红。咦,一看,好像缺少些什么?是什么呢?噢,原来它们的羽毛还没有长好。这两只小燕抖动着身……小学生运动会感想300字第一篇5月5日。小池中心小学第19届田径运动会开幕了。那天的下午,我看到了60米短跑。那些运动员们在起跑线上,躬下身子,单膝着地。等待着那一声枪响。接着他们就像风一……以快乐的年夜饭命题的400字作文今天是大年三十,我们预备了丰富的材料准备年夜饭。下面我来介绍一下吧。下午妈妈和小姨在厨房里忙碌着,我在一旁捣乱。妈妈在洗菜,小姨在活面,我在一边玩面团。过了一会儿,妈妈和……六年级我心目中的理想教师读后感(1000字)六年级我心目中的理想教师读后感(1000字)理想的教师,应该是一个充满爱心,受学生尊敬的老师。爱的教育,是教育力量的源泉,是教育成功的基础。正如夏丐尊先生所说:ldquo……她俩五年级作文她一名美丽与智慧并存的人民老师,一双弯弯的眉毛好似天上那皎洁的月光,水灵灵的大眼睛镶嵌在沉鱼落雁的脸蛋上,高挺的鼻梁竖在美丽的脸蛋上,一点都没有违和感,一个樱桃似的小嘴,招人喜……热门圣诞节的作文500字合集五篇在平平淡淡的日常中,大家对作文都再熟悉不过了吧,借助作文人们可以实现文化交流的目的。作文的注意事项有许多,你确定会写吗?下面是小编收集整理的圣诞节的作文500字5篇,欢迎阅读,……儿时趣事日记记得11岁那年,我穿上了妈妈的衣服四处乱逛,回家时结果被妈妈大笑一顿。听完这句话你也许会笑,愿意笑你就笑吧,我不会理你。一个星期六,妈妈去泰顺了,想让我锻炼自己。早……初中诗歌散文思绪飞扬在另一片空间用脆弱的的指尖去感受零星的痛痒,用心灵去感应周遭的环境。青春是道明媚的忧伤,明媚得让人心动也忧伤得让人彷徨。独自漫步在幽深的小道上,让思绪得到彻底的飞扬。无意抬头远出的山……保护环境英语话题作文Therearestillmanyproblemsofenvironmentalprotectioninrecentyears。Oneofthemostseriousprobl……
荣耀Magic3至臻版更新新增支持微信3D人脸支付功能【手机中国新闻】在进入智能手机时代以来,我们的支付方式就发生了翻天覆地的变化。发展到现在,我们已经开始用指纹、面容完成支付行为,但是这样也会有一定的风险和限制。近日,手机中国发……难忘军训的作文600字导语:军训生活已经过去5天了,但我每当走过操场便会想起那教官给我们示范的动作。下面是小编整理的一些军训优秀作文,欢迎查阅,谢谢!篇一:难忘的军训在漫长的三天军训中,让我感……手机屏幕均衡党看过来聊聊手动最高亮度的重要性如果你对手机屏幕要求素质高,又追求功耗均衡、那么请花那么几分钟的时间、看看我来分析一下、对你择机会有用的。对手机屏幕有一定了解和关注的人都知道论显示效果和清晰度、ppi高……最珍贵的礼物高一作文8篇【篇一:珍贵的礼物作文300字】在我过生日那天,许多人都给我送了生日礼物,而我的哥哥李欣浩却给我送了一件值得让我开心的礼物。你猜,他送的是什么礼物?他带我去济南游乐园,让……想换台手机,什么牌子的好?中华有为,大有可为!华为现在正处于困难时期,作为一名中国人,必须支持一下。我18年的荣耀8X,现在依旧坚挺,打算换换电池,增加下内存,坐等华为王者归来!按键的老年非智能机……初三观看里约奥运会有感征文奥运,在让咱们非常好地了解奥运精力:在全民健身和大众体育开展的助推下,奥运会从宏大叙事中解放出来,变得让每一位一般人更可接触。下面是小编整理的观看里约奥运会有感征文,欢迎大家参……大势所趋!未来十年这些职业将逐渐衰败,失业者又要忙着找工作了随着5G商用、人工智能、数字化产业的发展和智慧城市、智能家居、无人驾驶、无人超市的广泛大规模应用,很多的职业都将会被淘汰。以下列举的是未来10年很有可能消失的职业,提供给……照片里的故事作文500字虽然有些事情过一段时间我们会忘掉,但是照片可以把我们过去的事情记录下来为我们留下了许多美好,难忘的回忆。小编收集了照片里的故事作文500字,欢迎阅读。第一篇:照片里的故事……告别折叠焦虑三星GalaxyZFlip35G诠释外刚内柔中坚折叠屏手机问世之初,虽然有着酷炫的外表,但却要承受着花瓶的质疑。因为真实存在的技术难题,让人们无法完全忽略折叠屏的耐用性。三星电子作为折叠屏发展的开拓者,始终致力于攻克一个个难……如何选择家庭打印机?吞金兽要读幼儿园了,要打印的东西多了起来,买了一台家用打印机。买之前特意查了一下打印机的相关知识,记录下来供大家参考。一、打印机的分类打印机常见的分为喷墨打印机和激……与母亲相处的日子作文800字窗外花开自无言,正是人间四月天,眼前尤现她的容颜。与母亲相处的日子,平淡,却又格外温暖、幸福。正值百花争艳的季节,繁花如锦幛,异常美丽,看惯了花开花落的我,也不由得……大自然的叮咛作文600字淡淡的白云。蓝蓝天空青翠的树木,宽广的海洋,这一幅幅美丽的画面都相互呼应着,相互拼接,如拼图一般组成一副彩色的自然风景画,这就是大自然。随着人类的科技发展,自然渐渐被世人……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网