रोकू सर्विस
wdio-roku-service एक तृतीय पक्ष पैकेज है, अधिक जानकारी के लिए कृपया देखें GitHub | npm यह सेवा WebdriverIO के कई हिस्सों को ओवरराइड करती है ताकि उन्हें रोक ू ऐप्स के साथ उपयोग किया जा सके और परीक्षण के दौरान रोकू को नियंत्रित करने के लिए Roku ECP तक पहुंच प्रदान करती है।
आवश्यकताएँ
Roku
एक टेस्ट चैनल/channel.zip और एक रोकू डिवाइस (डेवलपर मोड सक्षम के साथ) जो आपके मैक के साथ एक ही नेटवर्क पर हो।
WebdriverIO
यह एक स्टैंडअलोन प्रोडक्ट नहीं है -- इसका उपयोग WebdriverIO टेस्ट फ्रेमवर्क प्लगइन (या उनके शब्दकोष में सर्विस) के रूप में किया जाता है। इसका उपयोग करने से पहले, आपको npm init wdio@latest चलाकर WDIO के लिए सेट अप से गुजरना चाहिए।
सेटअप चरणों से गुजरते समय, ताकि आपको सभी प्रश्नों/विकल्पों को नेविगेट न करना पड़े, आप इनिट चरण के दौरान निम्नलिखित चयन कर सकते हैं:
- Roku Testing (नोट: इसका उपयोग करें यदि आपका रेपो केवल रोकू टेस्टिंग के लिए उपयोग किया जाएगा क्योंकि यह डिफॉल्ट और केवल इंस्टॉल की गई सेवा बन जाएगी। अन्यथा, E2E टेस्टिंग का उपयोग करें ताकि आप कई सेवाओं को इंस्टॉल कर सकें।)
- On my local machine (केवल E2E)
- Web (केवल E2E)
- Chrome (केवल E2E)
- Mocha
- Typescript [मॉड्यूल TS और JS दोनों के लिए काम करते हैं, इसलिए जो भी चाहें चुनें]
- autogenerate some test files (Y) -- default location
- page objects (Y) -- default location
- spec reporter
- additional plugins (N)
- Visual Testing (N)
- services (roku)
- npm install (Y)
Typescript Config
यदि आप टेस्ट लिखने के लिए Typescript का उपयोग करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि Webdriverio द्वारा जनरेट किए गए tsconfig.json फ़ाइल में निम्नलिखित विकल्प सेट हैं।
"moduleResolution": "nodenext",
"module": "NodeNext",
फिर आप सेवा का उपयोग नीचे दिए गए विवरण के अनुसार अपने परीक्षणों में आयात करके कर सकते हैं।
WDIO Config
वर्तमान में, परीक्षण केवल एक रोकू डिवाइस के लिए समर्थित है। निम्नलिखित कॉन्फिग अपडेट आवश्यक हैं:
maxInstancesऔरmaxInstancesPerCapability1 होना चाहिए। कई डिवाइसों पर स्वचालित रूप से परीक्षण समर्थित नहीं है और इसके परिणामस्वरूप रोकू को डुप्लिकेट कमांड भेजे जाएंगे। केवल एक क्षमता होनी चाहिए।
//wdio.conf.js
export const config: WebdriverIO.Config = {
maxInstances: 1,
capabilities: [{
browserName: 'chrome'
// or if you want headless mode:
browserName: 'chrome',
'goog:chromeOptions': {
args: ['--headless', '--disable-gpu']
}
}],
//...
}
- यह अनुशंसित है कि
waitforIntervalऔरwaitforTimeoutको बढ़ाया जाए, क्योंकि प्रत्येक इंटरवल में रोकू से XML डाउनलोड करना शामिल है।browser.debug()फीचर से अधिक प्राप्त करने के लिए, आप विकास कक्ष के लिए अपने mocha टेस्टरनर टाइमआउट को 5+ मिनट तक बढ़ ाने का भी विकल्प चुन सकते हैं।
//wdio.conf.js
export const config: WebdriverIO.Config = {
waitforTimeout: 30000,
//optional:
mochaOpts: {
ui: 'bdd',
timeout: 600000
},
//...
}
आप अपना पहला टेस्ट लिखने के लिए तैयार हैं!
import { installFromZip } from 'wdio-roku-service/install'
import { exitChannel } from 'wdio-roku-service/channel'
import { Buttons, keyPress, keySequence } from 'wdio-roku-service/controller'
describe('first test', () => {
before('On the landing screen of the test channel', async () => {
await installFromZip(process.env.ROKU_APP_PATH)
})
it('should launch to the homescreen without login', async () => {
await $("//LoadingIndicator").waitForDisplayed({ reverse: true })
await expect($("//ContentCarousel")).toBeDisplayed()
})
after('should return to home', async () => {
await exitChannel()
})
})
यह भी प्रोत्साहित किया जाता है कि आप डीबगिंग और टेस्ट लेखन के लिए अपने टेस्ट को रोकने के लिए wdio में browser.debug() फीचर का उपयोग करें:
// ...
it('should launch to the homescreen without login', async () => {
await $("//LoadingIndicator").waitForDisplayed({ reverse: true })
await expect($("//ContentCarousel")).toBeDisplayed()
await browser.debug()
// the test halts, a REPL becomes available for commands
यदि क्रोम हेडलेस नहीं है, तो आप देख सकते हैं कि आखिरी बार जब openRokuXML() को कॉल किया गया था (संभवतः waitForX या expect के माध्यम से)। अपने टर्मिनल में REPL का उपयोग करके, आप किसी भी वैध $ कमांड का उपयोग कर सकते हैं, और कुछ प्रमुख कस्टम कमांड जोड़े गए हैं (browser.openRokuXML() और browser.saveScreenshot('path/to/ss.jpg')) - controller क्लास browser ऑब्जेक्ट से अटैच नहीं है, इसलिए आप वर्तमान में उनका उपयोग नहीं कर सकते। सौभाग्य से, आप शायद रोकू के पास बैठे हैं और आपके पास एक रिमोट है जिसका उपयोग आप नेविगेट करने और कभी-कभी browser.openRokuXML() को कॉल करके यह देखने के लिए कर सकते हैं कि पेज स्टेट का क्या हुआ! और याद रखें कि XML क्रोम ब्राउज़र में ही xpathing के साथ नेटिव रूप से काम करता है, इसलिए आप डीबग के दौरान क्रोम कंसोल में सीधे अपने सेलेक्टर्स का मूल्यांकन/विकास कर सकते हैं।
.env
.env.example फ़ाइल देखें। इसे कॉपी करें और इसका नाम बदलकर .env रखें अपने WebdriverIO प्रोजेक्ट में जो इस सेवा का उपयोग करता है। आप शायद इसे अपने .gitignore में भी डालना चाहेंगे।
ROKU_IPआपके रोकू का IP होना चाहिए। कमांड इसके साथ संवाद करने के लिए इस IP का उपयोग करेंगे। यह आवश्यक है।ROKU_USERऔरROKU_PW: एक आर्काइव इंस्टॉल करने के साथ-साथ स्क्रीनशॉट लेने के लिए भी लॉगिन क्रेडेंशियल आवश्यक हैं।ROKU_APP_PATHरोकू चैनल ज़िप फ़ाइल का एब्सोल्यूट पाथ होना चाहिए।ROKU_CHANNEL_IDआपके रोकू चैनल की चैनल ID होनी चाहिए (यह आमतौर पर "dev" होती है)।DEBUG=wdio-roku-serviceडीबग मैसेज को सक्षम करेगा। यदि आप उन्हें चाहते हैं तो लाइन के शुरुआत में '#' को हटा दें।
बदले गए फंक्शन्स
Browser
waitUntilपरिवर्तनों की जांच के लिए प्रत्येक इटरेशन पर रोकू से XML फेच करेगा।saveScreenshotरोकू से वर्तमान स्क्रीन का स्क्रीनशॉट डाउनलोड करेगा। विशेष रूप से, ये स्क्रीनशॉट .jpg फॉर्मेट में होते हैं, न कि .png फॉर्मेट में जिसे WebdriverIO आमतौर पर उपयोग करता है।openRokuXMLमैन्युअली रोकू से XML फेच करेगा यदि आपको इसे मैन्युअली करने की आवश्यकता है, न कि वेट्स के साथ।
Elements
- सभी वेट्स को ब्राउज़र के समान तरीके से समर्थित किया गया है।
waitForClickableकोwaitForDisplayedपर मैप किया गया है, औरwaitForStableकोwaitForExistपर मैप किया गया है। click,doubleClick, औरmoveToसमर्थित नहीं हैं। आपको मैन्युअल रूप से ऐप नेविगेट करना होगा।isFocusedएलिमेंट परfocusedएट्रिब्यूट के सत्य होने की जांच करेगा।isDisplayedएलिमेंट परboundsएट्रिब्यूट की जांच करेगा, और यह किvisibleको false पर सेट नहीं किया गया है। यदिwithinViewportसेट है, तो बाउंड्स की तुलना रोकू के स्क्रीन साइज़ से की जाएगी।getSizeऔरgetLocationboundsएट्रिब्यूट से वैल्यू लेते हैं, साइज़ के लिए 0 और पोजीशन के लिए -Infinity रिटर्न करते हैं अगर यह मौजूद नहीं है।
अन्य फ़ंक्शन्स में परिवर्तन नहीं किया गया है, लेकिन कई अभी भी अपेक्षा के अनुसार काम करते हैं।
Matchers
अधिकांश मैचर्स को XML फेच करने के लिए अपडेट किया गया है। कुछ में थोड़ा अलग फंक्शनैलिटी है।
toBeDisplayed,toBeDisplayedInViewport,toBeFocused,toBeExisting,toBePresent,toExist,toHaveSize,toHaveWidth,toHaveHeight, औरtoHaveAttributeसभी अपेक्षा के अनुसार काम करते हैं, जिसमें एलिमेंट में परिवर्तन किए गए हैं।toHaveElementPropertyकोtoHaveAttributeपर मैप किया गया है।toHaveElementClassएलिमेंट केnameएट्रिब्यूट की जांच करता है।toHaveIdकोtoHaveElementClassपर मैप किया गया है।toHaveTextएलिमेंट केtextएट्रिब्यूट की जांच करता है।toHaveChildrenएलिमेंट केchildrenएट्रिब्यूट की जांच करता है।toHaveHTMLXML को ऐसे मानेगा जैसे कि यह HTML हो, हालांकि यह संभवतः बहुत उपयोगी नहीं है।
निम्नलिखित वर्तमान में समर्थित नहीं हैं:
toBeSelected- यह जल्द ही समर्थित हो सकता है, यह निर्धारित करने के बाद कि चयनित बटन कैसे दिखते हैं, यदि कोई अंतर है।toBeChecked- यह जल्द ही समर्थित हो सकता है, यह निर्धारित करने के बाद कि चेकबॉक्स कैसे दिखते हैं, यदि कोई अंतर है।toHaveComputedLabel- यदि आपके रोकू एलिमेंट्स पर इसके समकक्ष है, तोtoHaveAttributeके साथ एट्रिब्यूट की जांच करें।toHaveComputedRole- यदि आपके रोकू एलिमेंट्स पर इसके समकक्ष है, तोtoHaveAttributeके साथ एट्रिब्यूट की जांच करें।toHaveHref- यदि आपके रोकू एलिमेंट्स पर URL हैं, तोtoHaveAttributeके साथ एट्रिब्यूट की जांच करें।toHaveStyle- XML एलिमेंट्स में स्टाइल नहीं होते।toHaveClipboardText- यह ज्ञात नहीं है।toHaveTitle- शीर्षक XML का यादृच्छिक रूप से जनरेट किया गया अस्थायी फ़ाइलनाम होगा।toHaveUrl- URL आपके कंप्यूटर पर XML फ़ाइल का पथ होगा।
उपयोग
Channel Installation
इसके लिए आपके चैनल को एक असाइन किया गया ID होना आवश्यक है।
import { installByID } from 'wdio-roku-service/install';
async before() {
await installByID(process.env.ROKU_CHANNEL_ID);
}
Archive Installation
यदि आपके पास कई डेवलपर हैं जिनके पास अलग-अलग स्थान और/या फ़ाइल नाम हो सकत े हैं, तो .env में पथ स्टोर करने की सिफारिश की जाती है।
import { installFromZip } from 'wdio-roku-service/install';
async before() {
await installFromZip(process.env.ROKU_ARCHIVE_PATH);
}
Pre-Installed Channel
यदि आपने परीक्षण से पहले ही चैनल को खुद इंस्टॉल कर लिया है, तो आप सिर्फ़ इसे लॉन्च कर सकते हैं।
import { launchChannel, exitChannel } from 'wdio-roku-service/channel';
async before() {
// Close the channel if it's already open. If the channel supports instant resume, this will merely background it
await exitChannel();
// Using the channel ID of 'dev' will launch the sideloaded application.
await launchChannel('dev');
}
Testing
wdio-roku-service/controller रोकू को बटन प्रेस भेजने की क्षमता प्रदान करता है। keySequence मुख्य है, जो क्रम में कई बटन प्रेस भेजता है।
import { Buttons, keySequence } from 'wdio-roku-service/controller';
// Navigate through the app
await keySequence(Buttons.LEFT, Buttons.LEFT, Buttons.SELECT, Buttons.DOWN, Buttons.SELECT);
// Fetch the current app UI from the Roku and load it into the browser
await browser.openRokuXML();
// Or, use waits, which will repeatedly load the XML until it times out or the condition passes
await browser.waitUntil(condition);
await element.waitForDisplayed();
// use WDIO matchers on the roku XML as if it was a webpage
await expect(element).toHaveAttr('focused');
wdio-roku-service/controller में बटन को होल्ड या रिलीज़ करने के साथ-साथ कीबोर्ड में टेक्स्ट टाइप करने के लिए भी फंक्शन्स हैं।
import { Buttons, keyboardInput, keyPress, keySequence } from 'wdio-roku-service/controller';
await keySequence(Buttons.DOWN, Buttons.DOWN, Buttons.SELECT);
await keyboardInput('example');
await keyPress(Buttons.ENTER);
await browser.openRokuXML();
Deeplinking
wdio-roku-service/channel चैनल-संबंधित फंक्शनैलिटी प्रदान करता है। inputChannel आपको अपने ऐप को मनमाना जानकारी भेजने की अनुमति देता है।
import { exitChannel, launchChannel, MediaType } from 'wdio-roku-service/channel';
await exitChannel();
await launchChannel(process.env.ROKU_CHANNEL_ID, myContent, MediaType.MOVIE, {myExtraParameter:true});
await expect(MyContent.header).toBeDisplayed();
Other Functions
wdio-roku-service/info विविध फंक्शनैलिटी प्रदान करता है, जैसे ऐप आइकन या अनाथ नोड्स प्राप्त करना।
import { getAppIcon } from 'wdio-roku-service/info';
const response = await getAppIcon(process.env.ROKU_CHANNEL_ID);
expect(response.headers.get('Content-Type')).toBe('image/jpg');
wdio-roku-service/ecp ECP के साथ सीधा इंटरफेस है यदि आपको कुछ अत्यधिक विशिष्ट करने की आवश्यकता है।
import { ECP } from 'wdio-roku-service/ecp';
await ECP('search/browse?keyword=voyage&type=movie&tmsid=MV000058030000', 'POST');
सामान्य गोटचा
- रोकू एलिमेंट्स का टेक्स्ट उनके टैग के बीच नहीं, बल्कि 'text' एट्रिब्यूट में होता है। सिलेक्टर्स का उपयोग करते समय, लगभग हर एलिमेंट के लिए
$('element=Text')काम नहीं करेगा। इसके बजाय, आपको$('element[text=Text]')करना होगा।