سؤال

كيف يمكنني فتح علامة التبويب في اختبار اسبريسو?حاولت أن أفعل Espresso.onView(ViewMatchers.withId(R.id.practice_results_tab)).perform(ViewActions.click());, ، لكن هذا لا يعمل.في هذا الرمز فتحت تخطيط علامة التبويب هذه.هناك ملف شمل:

    <TabHost
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/practice_tabHost">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical">

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">
            </TabWidget>

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <LinearLayout
                    android:id="@+id/practice_settings_tab"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:orientation="vertical">

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/practice_results_tab"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:orientation="vertical">

                </LinearLayout>
            </FrameLayout>
        </LinearLayout>
    </TabHost>

ما المعرف الذي يجب أن أستخدمه لفتح علامة التبويب?

خطأ في لوغكات:

Caused by: java.lang.RuntimeException: Action will not be performed because the target     view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
Target view: "LinearLayout{id=2131296384, res-name=practice_results_tab, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}"
هل كانت مفيدة؟

المحلول

الكود المنجز

تحتاج حقا إلى إضافة رمز لنا لإعطاء إجابة مناسبة. أنا أظن هنا أنك استخدمت Tabhost و TabWidget في الطريقة التي يقوم بها هذا المثال: https://maxalley.wordpress.com/2012/10/25/Android-Craiting-A-Tab-layout-with-Tabhost-Tabhost-Tabwidget/ < / A>

لقد قمت بإنشاء مشروع عينة في https://github.com/hanscappelle/so-25016397 < / a>

قد تبدو نشاطك بعد ذلك:

giveacodicetagpre.

وجدت مثال رمز آخر في https://maxalley.wordpress.com/201/201/10/27/Android-Styling-the-tabs-in-a-tabwidget/ مع طريقة مساعد يقوم بحقن Guardaceticetagcode لعلامات التبويب.

giveacodicetagpre.

الآن يحصل على سبب مثير للاهتمام بهذه الطريقة يمكننا بسهولة تعيين معرف أو علامة على هذه الكائنات من حقن GuardseDiceTagcode واستخدامها في Espresso.

الحل: علامة العرض

إذا كنت تتكيف مع هذا المساعد لقبول علامة لكل رمز مساعد سيبدو شيئا مثل هذا:

giveacodicetagpre.

إذا كنت تستخدم الرموز فقط، فيمكنك ضبط المعرف على ImageView أيضا.

و Code Espresso النقر فوق علامات التبويب هذه:

giveacodicetagpre.

الحل البديل: استخدام معرفات العرض

إذا ذهبت للحصول على معرفات، فأنت بحاجة إلى تحديد هذه المعرفات في مكان ما. استخدم ملف مورد أندرويد بسيط مع بعض تعريفات الهوية.

ملف مورد معرف العرض، اسمه /values/ids.xml:

giveacodicetagpre.

المساعد المتكيف:

giveacodicetagpre.

إذا كنت تستخدم الرموز فقط، فيمكنك ضبط المعرف على ImageView أيضا.

و Code Espresso النقر فوق علامات التبويب هذه:

giveacodicetagpre.

حول Tabhosts بشكل عام

لماذا استخدمت Tabhost هذا في المقام الأول؟ لاحظ أن هذه الفئة متهمية الآن. viewpager مع علامات التبويب أو قد يكون ActionBar خيارات أفضل حسب حالة استخدامك.

استخدم أداة العطل

في حالات مثل هذه المشكلة الأولى غالبا ما تكون للعثور على الرأي الصحيح. لهذا استخدام عرض هرمي أداة. إنها جزء من Android SDK وتعيش في دليل الأدوات.

يمكنك أن تبدأ من سطر الأوامر مثل هذا:

giveacodicetagpre.

أو استخدم Android Studio القائمة: الأدوات> Android> Android Device Monitor. ثم افتح وجهة نظر التسلسل الهرمي من القائمة الموجودة في جهاز الجهاز: Window> Open Perspective> عرض التسلسل الهرمي.

أفضل الخيار الأول لمجرد أن شاشة الجهاز يفعل الكثير من النوايا لدينا.

الآن استخدم عرض التخطيط في تركيبة مع عرض خصائص العرض للعثور على معرف وعلامات العرض الذي تريده.

بعض التعليمات حول هذه الأداة: http://developer.android.com/ أدوات / تصحيح / تصحيح الأخطاء ui.html

نصائح أخرى

الشيء الوحيد الذي يعمل بالنسبة لي هو:

public void clickOnTab(String tabText) {    
    Matcher<View> matcher = allOf(withText(tabText),
                                  isDescendantOfA(withId(R.id.ll_tab_container)));
    onView(matcher).perform(click());    
}

أين ll_tab_container هو لينيرلايوت لتخطيط علامة التبويب المخصصة الخاصة بي.وإذا كان لديك علامة تبويب تسمى" التسوق " ثم كنت تمرير ذلك كما تابتكست.

onview (withtext ("علامة التبويب" الخاصة بك ")). أداء (انقر ())

من الممكن أيضا تعيين علامة على نص علامة التبويب دون استخدام طريقة مؤشر مخصص.يمكنك القيام بذلك عن طريق الوصول إلى علامة التبويب TextView بعد أن تم إنشاؤه.

باستخدام MainActivity من رمز المثال هكبل ، التي من شأنها أن تبدو شيئا من هذا القبيل:

public MainActivity extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TabHost tabHost = getTabHost();

        // setNewTab(context, tabHost, tag, title, icon, contentID);
        this.setNewTab(this, tabHost, "tab1", R.string.textTabTitle1, R.drawable.ic_tab_settings, R.id.practice_settings_tab);
        this.setNewTab(this, tabHost, "tab2", R.string.textTabTitle2, R.drawable.ic_tab_results, R.id.practice_results_tab);

        // Set custom tag on first tab
        View tabView1 = tabHost.getTabWidget().getChildAt(0);
        TextView tabView1Text = (TextView) signUpTabView.findViewById(android.R.id.title);
        signUpTextTab.setTag("TAG_TAB_ONE");

        // Set custom tag on second tab
        View tabView2 = tabHost.getTabWidget().getChildAt(1);
        TextView tabView1Text = (TextView) signUpTabView.findViewById(android.R.id.title);
        signUpTextTab.setTag("TAG_TAB_TWO");
    }
}

ثم في اختبار الإسبريسو الخاص بك ، يمكنك الوصول إلى علامات التبويب مثل هذا:

onView(withTagValue(Matchers.is((Object)"TAG_TAB_TWO"))).perform(click());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top