5

के बिना क्लिक नहीं किया गया है, मुझे परीक्षणों में "स्लीपर" (Thread.sleep(millis) का उपयोग करने से नफरत है, लेकिन बिना स्लीपर के कुछ परीक्षण विफल हो जाते हैं।एपियम + सेलेनियम एंड्रॉइड: सूची दृश्य आइटम थ्रेड.sleep

मेरे पास है Android एप्लिकेशन में और मैं सूची में पहले आइटम (हमारे मामले में सऊदी अरबी) पर टैप करना चाहता हूं।

Countries ListView

public AndroidDriver androidDriver; 
... 
androidDriver = new AndroidDriver(serverAddress, capabilities); 
androidDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
driverWait = new WebDriverWait(androidDriver, 30); 
// at this moment everything is initialized and working properly, 
// Appium server is up and running 
driverWait.until(ExpectedConditions.visibilityOfElementLocated(By.id("com.###.debug:id/countries_list_view"))); 
WebElement countriesList = driver.findElement(By.id("com.###.debug:id/countries_list_view")); 
List<WebElement> countries = countriesList.findElements(By.id("com.###.debug:id/list_item_container")); 
WebElement country = countries.get(0); 
// country isn't null, and it corresponds to a real ListView row 
driverWait.until(ExpectedConditions.elementToBeClickable(country)); 
Thread.sleep(1000); // <---- country isn't clicked without this 
country.click(); 

एक ही समस्या Calabash/Cucumber परीक्षण में मौजूद है (स्पष्ट प्रतीक्षा करता है) की आवश्यकता।

मैं

  • driverWait.until(ExpectedConditions.visibilityOfElementLocated(By));
  • driverWait.until(ExpectedConditions.visibilityOf(WebElement));
  • driverWait.until(ExpectedConditions.elementToBeClickable(By));
  • driverWait.until(ExpectedConditions.presenceOfElementLocated(By));

तत्व है जो क्लिक किया जाना चाहिए के लिए इंतजार और कोई भी काम कर रहा है के विभिन्न तरीकों की कोशिश की है। फिलहाल जब मैं ListView 1 आइटम पर टैप करने का प्रयास करता हूं, ListView मौजूद है और सभी सूची तत्व स्क्रीन पर हैं।

मैंने Appium Inspector का उपयोग कर सूची पंक्ति XPath प्राप्त करके ListView पहली पंक्ति को खोजने का प्रयास किया है। नतीजा वही है - दृश्य Thread.sleep के बिना क्लिक नहीं किया गया है।

परीक्षण में Thread.sleep का उपयोग करना वास्तव में खराब अभ्यास है और मेरे परीक्षण अस्थिर बनाता है। मैं इस मामले में परीक्षण परिणामों पर भरोसा नहीं कर सकता, क्योंकि अगर आवेदन ठीक से काम कर रहा है तो भी वे असफल हो सकते हैं। सेलेनियम परीक्षणों में "प्रतीक्षा" और "नींद" उपयोग के बारे में एक लेख है (Selenium WebDriver wait)।

  1. परीक्षणों में ऐसे मुद्दों को कैसे ठीक किया जाए?
  2. ऑटोमेशन दुनिया में कितनी बार Thread.sleep कॉल का उपयोग किया जाता है? (मैं ज्यादातर एंड्रॉइड डेवलपर हूं, और मोबाइल स्वचालन में अनुभव नहीं किया)।

अद्यतन: मैं अंतर्निहित और स्पष्ट प्रतीक्षा करता है ऊपर का मिश्रण न करने की कोशिश की है, JeffC उल्लेख किया है, और यह मदद नहीं की।

यहाँ मेरी परीक्षा है:

@Test 
public void selectCountryLanguageAndStartApplication() throws Exception { 
    countryLanguagePage.loaded(); 
    countryLanguagePage.selectFirstCountry(); 
    countryLanguagePage.pleaseSelectCountryTextIsHidden(); 
    countryLanguagePage.startClick(); 
} 
... 
/** 
* Verify the page has loaded 
*/ 
public static void loaded() { 
    driver.findElement(By.id("com.###.debug:id/countries_list_view")); 
} 

मैं अगर पेज हर परीक्षा में लोड किया जाता है की पुष्टि करने कर रहा हूँ। अगर मैं केवल अंतर्निहित प्रतीक्षा करता हूं - परीक्षण समय-समय पर विफल रहता है; अगर मैं केवल स्पष्ट प्रतीक्षा करता हूं - यह वही है, परीक्षण समय-समय पर विफल रहता है।

मुझे Appium tutorial में मिला है कि वे स्पष्ट 1, 2 के साथ implicit का उपयोग करते हैं। यह docs के अनुसार अजीब लग रहा है।

काम कर समाधान: मैं थोड़ा loaded विधि

public static void loaded() { 
    driver.findElement(By.id("com.###.debug:id/countries_list_view")); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

है कि नींद का होना "स्थिरता" परीक्षण करने के लिए लाता है और मैं स्पष्ट प्रतीक्षा करता है साथ या उनके बिना उन पर तत्वों और प्रेस पा सकते हैं संशोधित किया।

क्या इसका मतलब यह है कि मुझे "नींद" जोड़नी चाहिए जब नया Activity लॉन्च हुआ (मेरे लिए एकमात्र कामकाजी समाधान)? या मैं गलत तरीके से गतिविधि शुरू करने की प्रतीक्षा कर रहा हूं?

+0

'driverWait.until (ExpectedConditions.elementToBeClickable (तत्व));' यह होना चाहिए 'elementToBeClickable (देश)' बजाय? – AdamMc331

+0

संख्या। स्पष्ट प्रतीक्षा के बारे में पोस्ट से "सेलेनियम वेबड्राइवर प्रतीक्षा" लिंक देखें। –

+0

ठीक है, बस जांच रहा है। मैंने सेलेनियम का उपयोग नहीं किया है, लेकिन मैंने एंड्रॉइड के लिए एस्प्रेसो का उपयोग करके कुछ स्वचालित परीक्षण किया है और मुझे याद है कि काम पर परीक्षण के लिए डिवाइस पर एनीमेशन बंद करने की सिफारिश की जा रही है। एनिमेशन क्लिक सूची आइटम के साथ मुद्दों का कारण बन सकता है। क्या आपने ऐसा करने की कोशिश की है? – AdamMc331

उत्तर

0

आप इस कोशिश कर सकते:

WebDriverWait wait = new WebDriverWait(driver, 30); 
    wait.until(ExpectedConditions.elementToBeClickable(By)); 

या

while(!driver.findElement(By).isDisplayed()) 
{ 
    //Thread.sleep(10); 
} 

मुझे लगता है कि Thread.sleep कॉल का उपयोग करने से ठीक (और लगभग आवश्यक हो तो अपने परीक्षण समय शामिल है) हैं, लेकिन सबसे अधिक भाग के वहाँ एक बेहतर करने के लिए अधिकांश चीजों को संभालने के तरीके जिनका उपयोग उनके लिए किया जाएगा।

आशा इस मदद करता है,

लियाम

+0

मैं अपने उदाहरण में सशर्त इंतजार का उपयोग कर रहा हूं, यह वैसे भी काम नहीं कर रहा है। –

+0

ठीक है, आप 'isDisplayed' विधि का उपयोग कर परीक्षण को मजबूर करने के लिए तत्व को प्रदर्शित होने तक प्रतीक्षा कर सकते हैं। उदाहरण –

+0

के साथ अद्यतन उत्तर मैंने 'while'-solution का उपयोग करके तत्व की प्रतीक्षा करने का प्रयास किया है, और परीक्षण कभी-कभी विफल रहता है। तत्व पर क्लिक करने से पहले, मैंने अपनी "isDisplayed" संपत्ति मुद्रित की है, और यह हर समय सच है, लेकिन तत्व को छूए बिना परीक्षण विफल रहता है :( –

संबंधित मुद्दे