So, welcome everyone to this workshop which is Builder Responsive TypeScript WDIO Framework by Varuna Srivastav and Vim Sillis. We are glad they can join us today and this particular workshop is sponsored by Saucelabs so we would like to thank Saucelabs for that and without further delay over to you Vim and Varuna. Thanks Shrita. Hi all. Hope you all are doing well. So, I am Varuna Srivastav. I have been a Lead Quality Analyst at ThoughtWorks. So, today in this 90 minute session you would see how we are going to build a responsive web driver IO or framework using our TypeScript. End of 90 minutes you would have your own framework, a basic structure of an end-to-end test framework with a TypeScript and web driver IO. So, before we go and deep dive into the session, may I have a quick thumbs up of how many four of you folks have worked on JavaScript before. Cool. So, you would see why are we moving from JavaScript to TypeScript or what had helped us using a TypeScript. Over to you Vim. Okay. Well, yeah, my name is Vim Sillis. I'm a senior solution to our detected Saucelabs and let me just start by going to the agenda about what we're going to discuss today. Like you already saw in the introduction slide, we're going to build our own automation framework with TypeScript and web drive IO. But to build it, we first want to start with exploring a bit more of the dependencies that are needed to build that framework. And we will start with the basics and then from the basics in the end go to web drive IO TypeScript and then we will provide you the demonstration for this workshop. But basically to start, we need to know our environment. And in this case, we're going to start with Node.js. Node.js is kind of like the environment we're going to use to run all our test cases on. So, Node.js, let me first take a look at it, what it's not. And this is kind of like something that we see a lot if we ask people and ask them, okay, what is Node.js? Nine out of 10 times people say it's a programming language and no, it's not. It's not a programming language. Basically, you use JavaScript together with Node.js to do something. What is Node.js then? Well, Node.js, as you can see here, is an open source cross-platform runtime environment for JavaScript outside of your browser based on Chrome's V8 engine. And basically it gives you more opportunities to work, for example, with the file system on your machine or on your CI pipeline. It gives you the options to work with the network, with the operating system. There are a lot of core modules and you can find them also in the documentation that will help you develop the stuff that you want to do. It's not only for testing, there's much more that you can do with Node.js. And just to give you a brief history also about Node.js, it was founded also in 2019. It introduced a lot of innovating thinking and approaches for using a JavaScript service site development because normally, JavaScript is only available for your browser. But with Node.js, you've got that runtime environment to also run JavaScript outside of your browser. And to do that, browsers got better and better from 2009. And then the V8 engine from Chrome came. And that's a very, very powerful engine. And that engine is used within Node.js. And if we would then look also at how it evolved then in 2010, they developed Express, basically giving you the opportunity to host a simple website with a web server on your machine. 2011, sorry, MPM1 was released. And I will dive a little bit later into what MPM is. And you can also see it kind of like the large companies like LinkedIn, Uber, they started adopting Node.js. Between 2012 and 2014, we got a lot of improvements. And in 2015, we saw that the Node.js Foundation was born. They supported the latest versions of JavaScript. They gave the possibility to create private modules. I will also dive into that later on. And like the competitor of MPM, package manager, which was called Yarn was also born. It was created by Facebook and some other companies. And basically what it also provided was a way to have the same packages of a module on the same versions between all developers. And I will dive into that later on. And last but not least, from 2016 till now, it evolved enormously. It went really sky high. Why? Well, basically with Node.js, you can do whatever you want. You can build APIs with it, for example. But you can also build very complex websites. And you might know all these logos like React or Angular or Vue. Node.js gives you the opportunity to do all those complex stuff. But it's not only for websites. You can even create mobile applications with JavaScript together with Node.js. Take, for example, a product which is called Ionic or React Native, giving you the opportunity to use JavaScript and to build a hybrid application or even a native application. Basically, it compiles to native SDKs. And last but not least, we can even build desktop applications. For people who know Appium, they also might know Appium desktop. Appium desktop was built with Electron. And Electron is also based on Chromium, using Node.js, using JavaScript, and being able to build something which you can use on OS X, on your Macs. You can use it on Linux or even on your Windows machine. But building all these things with JavaScript also means that you need to test it and preferably with JavaScript. And before we dive into the details about JavaScript, let's first take a look at the biggest difference between Java and JavaScript. Well, one of the biggest things, and I think this is really obvious, is the syntax. And with the syntax, I mean the way you write code, not only if you build an API, but also if you need to write something, some test cases. There's also a difference in the way everything is typed. Java is strongly typed language, so if you have a variable, it should be declared first before using it. But with JavaScript, you can just declare it whatever location in your page that they're used. But there's also a difference here. And this is something that also for Runa, I will mention when we're talking about TypeScript, but keep this in the back of your mind. Before you need to use Java, you need to compile it. You will get some errors if something went wrong and you cannot use it. But with JavaScript, it's client-side interpreted. You just run it and it will break at the line where you have your wrong code. So that's also a difference. But with also a very important difference is synchronous versus asynchronous behavior. And this is very important, this is a very important principle to understand. So let's dive a little bit more into that. If we have synchronous behavior, then we're talking about handle one blocking request in a single thread. And let me try to explain this with a simple example. If he would go to a restaurant and hopefully during the current pandemic, you have the opportunity sometimes to do it, but let's go to a restaurant where we have a waiter. We're sitting at table one and that waiter will go to our table. He will ask and he will take our order. And when we're talking about a synchronous process, he will go to the kitchen, he will give his order or our order to the chef. The chef will prepare the meal, but the waiter will still wait until the chef is done. When he's done, he will get back to my table. And then he will go back to, for example, a witness table. So she needs to wait before I get my food. This is basically how it works in a synchronous world. And I will also show you later on with a code example. Then we also have the asynchronous world. And this is basically how JavaScript and also Node.js work. They can handle multiple non-blocking requests on a single threat. So let's get back to a restaurant. This is a different restaurant. Again, I'm sitting at table one, Karuna at table two. The waiter is coming to me. He takes my order. He goes to the kitchen, but because this is asynchronous, the chef can already prepare the meal and the waiter can now also ask what Karuna wants to eat. And in this case, we can eat maybe even at the same time. So if we now look at that, you might also have heard of promises. And this is something which you will see in the asynchronous world. And promise is an object, as you can read here, that can return three different states. It can return a state which is called pending. It can return a state which is called fulfilled. And it can return a state which is called rejected. And see this, as you are doing a call to an API, that API is retrieving data from the database. Sometimes you just need to wait. In that case, the asynchronous call will give you back the status pending. If you get an answer back, it will give you back the status fulfilled with the answer. And if it went wrong, you will get back the rejected status. So if we would look at asynchronous code, and if we would look at promises, I've got a code example here. And as you can see, we have a function. And that function will put something in the console, but it will wait the amount of time that we tell it to wait. In this case, we say for the first line, wait three seconds, then do the console log of the first line. The second line will be console log of the second line. Then the third, again, we have a wait, but this time only two seconds. And then we have a fourth line, and then we need to print it. In a synchronous world, it will print it like this. So if you would do this, for example, in Java, all lines will be executed after each other. But in an asynchronous world, you will have something like this. And just take a look at what's happening now. Because we will now print line two, line four, then line three, which was waiting for two seconds, and then we're printing line one. And this is how it works with asynchronous code. It will execute all the calls and will only resolve when the time is done, when they need to print the results. So if we go back also to asynchronous code and would also look at Java and also for testing, then you might have an example like this, where you would say retrieve some text from an element. And in Java, this is just synchronous. It will wait for the text, and when it has the text, it will give it back to you, and you can print it. But when we're talking about JavaScript, and in the Node.js world, and especially if we're using Selenium or Appium, we need to resolve our promise. In this case, we're using asynchronous code, we would say driver dot find element by ID, for example, then retrieve the text. And when we have the text, then we can log it. And there are multiple ways and also advantages for doing this, because you can also now retrieve all types, all text of multiple elements, put them in a promise all, as we call it. And it will just print the result when all promises are executed. So all executions will be done at the same time. And when the slowest one returns, it will print the results. To kind of like get back to the behavior of asynchronous world, the JavaScript world introduced something which was called async await. And with async await, you can tell a line of code to do a blocking stop, retrieve the result, and then being able to print it. With async await, you can create the same behavior almost as the synchronous world. So hopefully you now got an idea between what synchronous and asynchronous is, and also one of the biggest differences between, for example, Java, which is the synchronous world, and JavaScript, which is the asynchronous world. Now let's take a look at NPM. You might have heard of NPM. And to give you a little bit of an idea of what NPM can do, it can do three things. First of all, NPM is the website. You can go to the website, you can find multiple things there. And as you can see here already, you've got products, you've got pricing, documentation, community. And in one of the first slides, I mentioned that NPM provides packages, and it also provides private modules. If you pay for NPM, it's all open source, which you can use, but if you pay for it as an organization, you can host your private code on their side, your private packages, and then we'll go back to packages in a few seconds. The second thing of NPM is that it's a command line interface. As you can see here, if you downloaded Node.js, you will get NPM for free, and you can do all kinds of things in your terminal. And last but not least, this is kind of like the most important part that maybe a lot of people also know NPM about. It's a registry where you can store all your packages. So you now might be wondering, what is a package? Well, a package is basically a project or a collection of JavaScript files. And all those collections kind of like that package will be described in a package JSON. And you can see a package JSON here. And in the package JSON, you can find what a package can do. In this case, we're looking at multiple Cucumber HTML reporter. It's a reporter module for Cucumber output for Cucumber JSON files. And it uses some dependencies. Those are the dependencies that are needed if we want to use the module. And we have some dev dependencies, as we call it. And those are the modules that are needed to develop that application. So now that we know a little bit more about the road, WebDriver.io is driving on Node.js, NPM, and also the packages, let's take a look at WebDriver.io itself. So WebDriver.io is based on the WebDriver protocol. So what does that mean? Well, basically, the WebDriver protocol is this. It's a remote control interface that enables introspection and control of the user agents. Translated, it's an interface to control, for example, browser drivers. And basically, yeah, the agents can be any technology, but yeah, we're here at Selenium conference. So let's just take the drivers itself as an example. And if you take a closer look also to the protocol, you can also see a list of API endpoints. And this enables a certain action to be carried out in the browser, for example, navigating to a URL or clicking on a link, clicking on an item. And this is implemented in the so-called browser drivers. You've got Chrome driver, you've got Gecko driver, you've got Safari driver, all types of drivers. And if you would then go back, how does it work? Well, we've got an element we want to select. You can use Selenium or you can use WebDriver.io to communicate or with the driver or with Appium or through a Selenium grid that will communicate with the drivers and then you can interact with your browsers and your devices. Official W3 standard for browser automation has also some advantages. It enables also the automation of all browsers and ensures that every command does the same for every browser. There's also a small disadvantage, as we might know in contrast to tools like, for example, Cypress. Only those functions can be defined in a WebDriver protocol that really work in all browsers. And if you would look at tools like Cypress or Tescafe, they add extra stuff that currently the current version of Selenium cannot do. And here you also see Selenium and WebDriver.io mentioned. And just to mention the difference between them, they both use the same protocol. So that's basically equal. But Selenium, you need to build your own framework. And with WebDriver.io, you will get a complete framework. And this will bring us to some of the key features also of WebDriver.io. One of the things, and this is also what we're going to do during the workshop, it's very easy to set up. As you can see here, there's just a command line interface where you can kind of like say what you want to do, and it can start downloading everything for you, and you've got your project already set up. Then, like I mentioned before, in the Node.js environment, everything is async. But the beauty of WebDriver.io is that you can choose both modes. You can choose async, as you can see here, but you can also choose the synchronous mode. And then WebDriver.io will do everything automatically for you. So if you're now used to a Java framework and you need to use something in JavaScript, I think WebDriver.io will be the best way and the easiest way to transfer all your test cases to JavaScript, because it's just synchronous. You can just enable this. Then what's also very awesome of WebDriver.io. They are very easy to integrate with whatever package you can find. They've got a specific Apptium service, which will start the Apptium server automatically for you if you've downloaded it. It got a visual regression testing service and also reporters. And we're going to dive also into a lear reporter during this workshop. What's also awesome is they've got multi-remote. And if you would just go back to the basics of a automation framework, you would have your test, you would have a test file that will communicate with the browser, and then you will have a result. But they also have multi-remote. This is not the same as running something in parallel, but this is made for test cases who need to communicate with each other. In this case, we've got a test file. And in a test file, we, for example, have, let's say, we want to test WhatsApp and we want to communicate between each other in the same test case. Multi-remote can do that. Multi-remote can give you the option to communicate between Chrome, for example, and a device. They can communicate with each other and in the end it will succeed or will fail. That's the awesomeness of multi-remote. Also, if you want to know more about WebDriver.io, there are tons of online tutorials. So easy for you also or enough possibilities for you to learn how to use WebDriver.io. Secondly, what we also have is that we have a large online community. We have around 5,000 people in our Gitter channel. And in the Gitter channel, if you ask a question, not enough time, between 15 minutes you would have or a response or maybe even an answer. And then WebDriver.io, yeah, this is sponsored by Salelabs, but WebDriver.io itself is not sponsored by Salelabs. It's not owned by Salelabs. It's an open source project and it's available free of charge in GitHub and MPI. The project itself belongs to the OpenJS Foundation and this is a non-profit organization that takes care of the sustainability and development of large open source projects and support the projects in many areas. Take a look, for example, at Node.js, ESLint, Webpack and Express.js. They also belong to that OpenJS Foundation. But enough about this. How do you start it? How do you start with WebDriver.io? We're going to dive into that later on, but just to give you an overview, we've got three different tastes. We've got the very hot one where you need to do everything yourself. The bare metal mode, as we call it, we've got a medium one. The standalone, but the most used version is the test runner. The test runner will just give you a configuration file where you can adjust a few things and it will do everything for you. Start a driver, stop a driver. You can also choose from different frameworks. You can choose Maka, Jasmine or Cucumber. Like I said before, there are a lot of plugins and extensions and you can easily create it yourself. You can create your own reporter, you can create your own service. Also, the option to create custom commands. You would say if there's an action you do repeatedly in your framework, you can just attach it to the browser or the driver command. In this case, we have a delete user function and we can just create that once and reuse that function multiple times, so preventing double code. Also, you've got the option with different ways to select elements. As you can see here, you can do it based on CSS, on X path, on link text. A lot of options, even options to interact with react itself. We even got support for the Shadow DOM. Last but not least, we also have the option to interact with elements, native elements together with Appium. I think a lot of options where WebDriver.io can help you build up your framework. That's basically what we're going to do now. But before we dive into that, we're going to look into TypeScript. So Faruna, stage is yours. Yeah, thanks, Wim. Yeah, so what is TypeScript and what it is all about and why should we use it? It's a type superset of JavaScript that compiles to a JavaScript. So it's not a brand new programming language. It adds a new features to a JavaScript which makes your JavaScript code easier and more powerful. It's a strongly typed, object-oriented, compile-based language designed at Microsofts and it is both a language and a set of two. So if you would see this slide here, it's more on adding a static typing to a JavaScript. So once you have a type, you can build a great tool around it, like a statement completion, code navigation, refactoring becomes very easier. So if I have to save in one line, a TypeScript starts with JavaScript and ends with a JavaScript. It adopts the basic building blocks of your program from JavaScript. Hence, you will need to know a JavaScript to use a TypeScript. So if we go to the next one here, TypeScript gets converted to a JavaScript. So TypeScript compiler transpiles for .ts to .js. Then the question comes here, how could TypeScript build a new feature if it does compile to a JavaScript? It compiles to a JS for corons and in addition to this, as a name implies, TypeScript adds an important feature type. So as a developer, when I'm building something, I'm more leaning towards getting the error when I'm writing a code than the error when it comes and deployed. So the journey of TypeScript, it started all in. So maybe we could go to the next slide please. Yeah. So initially, people were hesitant of using a TypeScript. It's since the slowness of the compiler. But since 2014, we could see a lot of improvements in the build. And the current version which was just launched in August 2020, version 4.0. So there are great features in this version, but two of my favorite ones are short assignment operators. So you would have seen that A plus A equals to A plus B. But in TypeScript, you could have A plus equals to B. So it has also introduced a three new operators, it's and, or, and then a label or operator. The other one is that we have a significance to improvements in build using the command hyphen hyphen no. So if we compare a JavaScript with a TypeScript, there are multiple differences which we could see in the next slides. So JavaScript is prepared to use in our small coding projects. We may be able to go to the next one please. And TypeScript is an object oriented language, which makes the code more consistent. It is cleaner. It's more simpler. You could remove a duplicates. It is more reusable code in your large enterprise. So the three major differences which I have picked up is more based on what we are going to do during our workshop. So whether as a developer or as a QL, do you want to have an error at a compile time versus a runtime? We would see examples of whether how the strongly typed language helps us when we are writing a set of codes. If TypeScript does support a module's generate and interface, which we don't have a support in a JavaScript. So if you are coming from a Java word, it would be easy for you to go and start using a TypeScript. So as you could see here in this example, one of the methods is on the base test, a cert item added again is not there. And what TypeScript gives you an error, then and there itself. So I don't have to worry about once my code has been compiled. So this property does not exist in my type and I could just use few shortcuts come on and get this added if you want to add this property. The next one is more on the type. Like how static and how strong the type is. So if you see the right hand side, the first example ABC.js. So here the intent is more on I'm going to add a two number 999 and my intent is to get an output as 80. But since it's a JS, it's going to concatenate these two strings. So it's taking nine digit as a string. And even though 99 is a higher number, my intent was not to get a 99. So it's a technical error. It's and it's a logical mistake in a group. But if you see the next example, add.js, we do have a defined a tag over a number. So now here, if I give up nine as a string, I would get that error before itself calling the ad function. There also comes the feature like people keep asking, we could do some work around in JavaScript. Yes, you could mitigate this. Well, before calling an ad function, you could have a logic like if num is equals to integer, or if you could provide those. But those extra line of codes and adding it to a simple function, you could imagine when you have a bigger functions like that, how, how many extra lines of code you need to add it on top of it as a developer, as a QA, you need to write those unit tests, like whether nine and nine should give me an output as what I'm expecting as 18, not a 99. So to get rid of that, we do have a mitigation strategy here, and that's where the tag strip comes into a picture. The next one, the feature of type strip, what is is more on the interface. So as in Java, you have your set of interface, so you don't have your class function being overloaded. So if you could see in this example, a username and a password is my element. And on top of that, what operation I'm performing, I'm adding a logging information. And in a login page class, I'm just using those information and those constructives. So type strip also helps to make abstract your properties and methods in your interface. So how let's get started. How would we get started with this workshop? If you could clone, please this repository, and then get to clone the master branch of it, we do have a multiple branches as we go during a demo. So, and we will walk you through all all the steps during our evening, how you could get started. Only prerequisite is to get the node being installed in your machine. So if you want, you could get started now. The most important thing to know here about while we get started is a TS conflict. So what is TS conflict? It's a type script conflict file. It's a directory that indicates a root of JavaScript or a type script. So you could have a jsconfig.json also, and you could have a tsconfig.json too based on what you want to use it. So it starts with an overview of every flag and then moves to a root attribute in json, the compiler options. The two most important thing which I want to highlight here is the target, which is my at my script and the types. So you would see during a demo that we would have those types like nodes, web driver, are you seeing and what are the test framework you are using. So once you are running during a workshop, it will ask to define the types. The next one is more on the type inference which you should be aware of. So here mostly I have added a list of cities. It's more on the Indian cities with three letters, but here comes a question also that I could add a list to a city code also. No, whenever you are adding a list of elements to a city code, it would give you an error then and there only you could know that. So your type inference is the key here that even though those city codes are valid in your list, it will always accept your city name. So let's quickly get started. So we have divided a demo in the four parts. The very first one will start with a master. Chapter one is to quick a setup of your whole package. Then we'll write a basic test. We will refactor these tests using a page update pattern and then at last we would integrate our running test for a live report. So let's get started. I'll share my screen pretty quick here. I hope you folks would have got the link of the repository. Right. So let's see, we'll go to a read me and what is the very first thing we have. So I already have a node being installed here. So let's see what version I have. So it's node hyphen B you do. You would be able to see the version. Same with an npm, npm hyphen B, which should be able to see the version. So now let's get started. The very first command what I'm going to run it npm init hyphen Y, Y, Y because I wanted to be added a default for my whole. So this will generate a package.json or dependencies. So if you're coming from a Java word and if you want to compare this file, it is pretty equivalent to your build or gradle in your gradle or your pom.html in your maverick.  But I'm giving it a basic. So let's read and it will quickly create a package.json. So if I go back to my code base now, I should have a package.json. The most important part here in the package.json is here is the place where you could specify your test, what kind of test you want to run, what is your category of the test. And now let's start adding some of the dependencies. So we'll add all the dependency in one group and then we can get started. So I'm going to install a type script, a web driver IO command line interface, a search library list, chai and mocha. You could also use your inbuilt web driver IO assertions, but my preferred one is a chai, so I'm installing that. Hope I'm still audible. So we are installing a type script, how are we installing a TS node here, and the web driver IO command line interface. Once this installation is done, we would create our web driver IO point fit project. So as Vim was also pointing in the presentation, that how with few clicks of commands, you should have your project being ready. It takes a little bit of time, so let's see it should be done. We should be done in a minute. Yeah, so we are good to go here. Now let's create our web driver IO. NPS is my web driver IO executable. So currently what we are doing here is I'm going to get this located at my local machine, or going forward you can integrate with a source lab, source browser stack, whichever you or you could use any of those frameworks mocha, jess, main cook umber. Amota is the most used one. So let's go with Amota here. We are using a sync mode on a web driver IO commands. And where are your tests located? So I want to look, locate my test in a test.js, but let's I would like to change the extension here as we would be using a piece, right? Do you want to web driver IO to auto generate some test file? Yes, let's auto generate some of the test files and see how the entire project structure looks. Do you want to use page objects? Yes, our third chapter is around the page object. So let's see. And where are your pages located? So even the page objects pages would be located in the same location. Only thing what I'm going to make it from JS to TS. We are using a tag strip compiler here. And for by the call, let's use a spec as a reporter. And in chapter four, we will integrate with an older reporter. Do you want to add here? We are using a phone driver. So what is the base here? So as for this workshop, we are using planning to use Amazon.in. You could use any of your base URL, whichever you feel like. And now we should be just ready in couple of seconds to get our first project. So before this project, after this project, you would see that you are still looking for a tag strip. So the most important thing here is the TS config.json, so which we would install next. You would see that if you want to run this, you would get that. So you could see your config file installed. And to have a sub tag strip support, please add the following packages to your tags list. So and you could run this using nps, web driver IO run web driver IO.conf.js. Cool. So let's go to our readme and initiate this file is created. And now we want to add these in my TS config.json. So let's go back to our repository. We do have your TS config.json. Under compiler options, we would see your types. So please see your types here. Yep. Here we go. And then let's add the type here. With me. Okay. So now let's run this test. So it's one of the spec files. And we will look into the structure of what it has created. So it's initiating a new session. So if you don't want logs, we could also disable these logs. So currently the log level is info, but if you don't want, we could make it a silent. We will do that. So here you could see that few commands and without writing a set of code, you have your basic setup project being ready. Right. So yeah, let's go and see what our structure of the project is. So if you go here under test, we have a specs. And under specs, we have an example test of TS. Right. And what it is doing, it is having a log in. And we do have some of the page objects. So this was our chapter one basic setup with our test gets running. So now let's go with an R example of how mix and dot in and start adding some of the tests. So what the use case we are looking for here today is we are looking for a use case of having adding an item to the card. So should and this is what my chapter is. So if you want, you could clone the chapter. We want to add an item to the card. Now let's remove the unused inputs if we don't have those. What we want to do here is we want to first open the browser. Let's maximize whenever we are opening a browser. And then let's browse it out. What URL we want to use. So we would use that base URL, whatever we had given it during our project creation. So HTTP, Poland, www.Pamelson. And what do we want to do here? We want to search an item and add to cards. So let's go to the website of Amazon. And let's go to the homepage. And suppose I want to search for a book. So let's inspect this element. So it's easy for us as it is an ID. We could quickly use it in our code page. So as it is ID, we can have it hash. So we have a locator. Now what do we want? We want to set a value to this. And what value we are looking for here is suppose you have, you're looking for a book. So let's make this as a variable. Let the title equals to book. And then let's set that value. What value we want to set here? We want to set item. And on top of it, we are also performing here a enter keyword. So let's also enter that. Once we have added this item, I should go to my search search result page. So before that, let's quickly run this test and see where we are. So if we want to run here, let's run here. Yes. So we have entered an item to the part. All good. So now on search result page, suppose I want to search the first book and Vim wants to select search the end book. So we need to identify the locator in that manner that anyone can do and search for any of those. So let's inspect this element. So we could see here, this is my product image, but we are looking for something on the, so let's put that here, something on the index, like first index or a second index. So let's see what we have on top of it and if we could get some of the index here. So yeah, we do have here dip data index one, which is my dip. So now tomorrow your test, anyone can pass it and you could add a data index and based on that data index, you could make it working. So this one is what I'm going to copy here, then data if an index equals to one. Right. So we got the image, we have a hold of image and under that we have an enter and then we have the data. So let's put this element in our code base and try to picture it. So we have put that element here and let's assign this as a variable and what we want, we want to click this element. So let's click this element. So we have already clicked our selected element. Now let's see what it happens when we click this element. So when we click this element, it opens in a new tab. So my current browser handle is still on the 0th one. So we want to switch to a new window to perform the next operation. And for that, what we will do here is we will do browser dot switch to window and then browser dot get window handles. So window handle starts from the index 0. So the first index is where my current locator is. So now we have, we are already on the item page and I would like to add this item to my card. So let's pretty quickly inspect this element, what it is, and then we can go to it. So input add to card. So now you could just add this item to the card. And since it was an ID, it was easy call for us and then dot get. So now your item has been added to card. Let's run this test and see where we are. So yeah, your item is added to card. So this is what our chapter two is. In the next chapter, we are going to introduce a page object for this card. So you would have already seen that we have interacted with a multiple pages from home page to search results page to an item page. So let's write us some pseudopode. What do we want to do here? Like from a page object item. So we know that we were on home page. And then on home page, what we did? We search for an item. So pseudopode helps me to visualize what all pages I need and what all we could have in our script. So let's have a data search for then the next one, what was it? We went to a search results page, then we had a set of item. And there what we did? We navigated, navigate to item. So now item, I'm going to navigate it by an index. So yeah, it's navigate to item. So once you are there navigated to item, what it is the next one is your item page where you are adding that item to the card. So you have these operations. So before searching what else do you need? You need to open the open page. So there is also one working here, home page of open. So we could now get started incorporating this in our page object. So let's create some of those pages under the page object. So we don't need these. So let's delete these. You all would have heard around the base page. So base page is where we will keep our headers, footers, all on base URL. So right now if you see we have a home page dot open. And for this test we are opening, but it could be for other tests also where we want to have the main base URL. So let's put those and that base URL if you go and see here if we search webriver.io.conf.js and if I type a base URL here, we could see it is configured to Amazon.in what we have given it during creation of the repository. So let's create some pages here. So the very first page which if I go back to my pseudocode it turns like a home page, right? And let's let's say it's my home page and we would need a base page for my UI. So let's also create a base page. If I go back here, this is what my base page dot .js looks like. So now we will introduce a interface here. So if we go back to a test class here, what do we need? A home page dot open. So before introducing our interface, let's extend my home page class to a base page. Class home page extends to a base page, right? And now let's do the export of this class new home page. And now let's also implement this home page. So let's implement this as the I home page and you would see what all we need to add it here. For now, I'm just creating our interface and keeping it for that. So now let's go back to our base page dot yes. And what do we, so since in home page we have already introduced here, so let's create a constructor here and pretty quick reformat it and go back to your base page dot yes. And what would be needed here is in a base page dot yes, we want to have a open method which takes a path as a string and in that we will keep what do we, in our test class, we have our, this is what we are looking for. So let's put here home page dot open. So this is my test suite or describe and it is my test. So we would need it before each test. So let's put a before here and this would be my setup method. And under this setup what I want, I want to call a home page dot open and with that I want to give a path which is already being defined in my web driver iodo.com.js. So let's go back to this and then here what do I need to do here browser dot maximize window and browser dot url is null path. So we have a very basic setup of the page dotted pattern being ready. So we could get rid of these two lines from the code and we could run this test to see where we are. So yeah, it has initiated the open method and the searchers still are previous in the base structure. So you could quickly and easily migrate to your page object by that. So now what is, so we have already incorporated this suitable. So let's see what we want to do. So we want to search for an item. So what do we have is home page dot search for some item, right? So let's go back to my home page class and define what do we want. So we need a search search key bar which would be my web driver iodo element. And now as soon as I have added this you could see that in typescript the home page class is giving me an error here. It is asking me for the implementation of this method. So now let's go back and then what method I need is search for. So let's again go to my home page dot ps and put that search for. Search for is my method which takes a key or you could put a index or let's see what it I think it will let's see what we want to put it here. So we want to search for an item here. So this is a key which is a string and all we could just return this as a one. Now we need to implement these two methods in my home. So we can just have implement all members. Yeah. So let's do this. We have search key bar will return the locator here. And this is what my I'll get the locator from my test class and then we want to search here. So we will put it here. This dot search key bar dot we want to set a value here. So let's put key plus again we need to enter key and then let's create a variable out of it and we can make it a search keyword. This dot search key bar dot set value of search. And now let's get the locators from here.  I would still need this item. Well, let's do quickly back here. And then what we could do here now I want to search for so home page dot sorry search for this item. We want to search for an item book. So we have implemented this part of it right now if we go back here we could just run the test after we are making the let's run the test and the next step would be to select that item and go to the package. Cool. So now let's go back again to our test class and what do we want here. Now we want us to navigate to with something. So let's put this search results page. So we don't have a search results page yet. So let's create that. Right. So results page of deals at this class as search results page and let's implement this class again with an interface. We still don't have that interface will create it now create an interface and then let's let's put this one before new one search results page. So let's go back to our test class. So what do we need here? We need to navigate to an item. So let's put this method in our interface navigate to item and since we are providing a this as an index so this would be my number right and as soon as I add there it will say to implement this in my class. So let's implement that in our class implement all members navigate to item. So let's again go back to so what is there in this method we want to click that element. So let's copy this locator here go to navigate this method and then get this as a variable. We want to pass this index. We don't want to hard code here the index. So let's pass that index and how would we pass it here? This is the data index and we want to put it under this one dollar. We could see a dollar and then the index. Now if I go to function last I need to change this. So we do have an element here. Now we want we want to do we want to click this element as we did before and then let's go back to our homepage. So we are good with these two lines here as we have already navigated to search results page dot navigate to. So let's put this point of time let's put our index as two right instead of one whatever we did to test whether our function is working or not and we can get rid of these two lines here. And yeah so what we have here is download or switch window. So we could put the same thing in my navigate to after. If I go back here yeah so if I go back to my example class now we know that we are on homepage we search for an item we are on search results page and then we navigated to item index two and let's pretty quick run this test before implementing the last page. So yeah we are searching here and again going back and so let's do for our last page here. What do we want here is item page dot add to dot. So if we go back and see here we don't have yet an item page. So let's create an item page here as item page and let's do this for default or new item page and then let's implement this. So if we go back to our class what do we need here we want to add an item to cart and how would we add that item to cart we should have some locator also. So we would need a method add item to cart and we would need one element right add to cart button right. So we could add that item to cart. So if you put again see that item page is looking for that method so let's do that add to cart button and let's return here the locator. Then what next is my add item to cart method. So all good with my test class here and let's implement this method. So what do we want here base dot add to cart button dot we are performing an option click here. So you don't have to wait for an element here as in whatever are you you do have a default date. So we'll go back to a test class and get the locator from there and put in in my template and we are done on this. So we have already selected item two and two. So this sort of would help me to visualize what I want to do. It's completely a personal choice. So we feel to add whatever you feel like doing it. And now let's run this test. There is one more thing here in the base page. So I've seen people also overpopulate the base page. So the thumb rule word should keep for any of the framework whichever you are designing from the best practices that base page line should not be more than 200 lines. If it is more than 200 lines start dividing your pages into a different components like a login or a shipping card or a different component. Yeah. So here we are going with our chapter three where we have incorporated a page of reference. So what our chapter four says is to introduce the reporting. So before that introducing a reporting here to an allure. Let's go and see what we have in current reporters. So if I search for your reporters here we should have a spec. So let's add the allure here in our report. And then let's and then also let's make the log level to a silent house being too much of information here now whenever we are running a test. If we need to do well we will again come back to the load level. We'll come back and change it. So yeah. So how would we integrate here? So if you go back to your review you should see this npm install web driver IO allure report. So once we install this reporter we will run the test again and we will see how the report looks like. Yeah. So it's installed. The next one is our allure command line interface to run and generate our reports. Now let's do generate. So we are generating a report and output here. So before generating a report let's run the test and then generate a report. Yep. So our test is already run. And now let's generate. So npm allure generate. So these instructions have been mentioned here in review. If you go down here under reporting section that how could you generate a report and how could you open that report. Yeah. So we could see that report successfully generated to allure report. Let's go and see here. Yeah. We already have here. Now we want to open this. So yeah. Now I'll do it open. Yeah. So we could see here that this is what my application here is and what it is doing here for a suit level. It is adding an item to the top. So this reporting helps like to also for you to visualize which all items or locators are taking time or sometimes it happens on your application. That capability or the locators are not present in. So you could get those and you have a history here also. And you could also see how many times those elements have been done. We have a quick graph here also. You could see this would like you could share this with your product owners and all who want to see the health of your system what it is all around. So you could also specify your reports based on your test use category. So right now I have only my web application but going forward you have multiple categories you could see which area of your application has took a longer part or which area needs some more attention from the test schools. Yeah. So that's all I had for the demo. So thanks for Runa also for this awesome presentation. I think we had a lot of questions also during this session. I answered them so you would not be disturbed giving kind of like your presentation. I think we've got some time now already if people have some questions for Runa or for me or about WebDriver.io or about types please ask them. Yeah thank you so much women Varuna for the session. Let's take the questions one by one if okay. So Vim did you take a did you have a chance to look at the Q&A section? Yes. Yes I answered all the questions except the last one. The last one we got in was how can one add learn and contribute for this project and I think then that Avraham means WebDriver.io. The project if you want to help also for WebDriver.io if you would go to the website of WebDriver.io and you would go to the homepage you will also find some information. Let me get it. It's not published yet. It will be published I think in a few days. There are also open office hours for WebDriver.io where you can like get more information on how to contribute to WebDriver.io. Just if you're on Twitter watch WebDriver.io the handle on Twitter and we will post if there is another open office session where you can kind of like learn how to contribute also to the project. We also have a list of good first picks if you would go to the GitHub channel on the GitHub project also from WebDriver.io. All issues that might be easy to fix with a PR with a pool request can easily be seen by looking at the label good first pick. So there are multiple ways also to contribute to WebDriver.io and make the product even better than it is currently. Okay I think there's a lot of appreciation and good feedback from the audience and I don't think we have any other questions really. Yeah we have all the likes popping up. So I just say that thank you once again Wim and Varuna for this fantastic practical hands-on. I think it was it was flawless.


It's the shortest, but it's also one of the most enjoyable That's a hot mug guys. Hey guys, this is my review for Harry Potter and the Order of the Phoenix now I will be straight up right off the bat. I actually disliked this book the most I admittedly have only read it once but it took me forever to get through mainly because Harry was going through his Emo phase as I would say in the book He also goes through a bit of that in the movie as well with him just feeling all alone Saying he's gonna go off on his own. No one cares about me. No one understands me He actually says you don't understand. Emo Harry in the movie is thankfully far less Nauseating than the book version. However, there also are a few bits cut out from the book that are kind of unfortunate losses particularly when they go to the Magical hospital and they found Gildroy in there, but they also come across Neville's parents This is one aspect of the film that They try their best to do without actually going all the way there and showing his parents Physically more so through the photos.  We talk about his parents. We talk about Bellatrix We talk about the scope of what is coming funnily enough as I said It's the longest book in the series and it somehow translated into the shortest film And I think it's because they cut off so much fat that they Make it one of the most enjoyable films because they're focusing on the very key essential elements being Harry's Kind of relationship with Dumbledore as well as his own sort of wanting to fight his own Resilience to what is going on as well as the kids coming together to form Dumbledore's army Obviously Delores Umbridge being the most evil bitch in all of written literature almost I think she even scored up there as one of the most evil characters ever written. I think it was on some Survey a while back, but she is an evil evil little woman who I kept on going back and forth was I couldn't remember if She's a death theater or not because she's a full-on Gestapo SS officer search essentially in terms of how she governs the Hogwarts school However, the problem is the order of the Phoenix is actually So relegated in this film and that might be one big complaint about it Is that for it being the title of the movie? They only make up about the first maybe 10 minutes of it and then everything else afterwards is Harry The whole order of the Phoenix is a resistance group of as well as Cornelius fudge being a very very clear as-day Neville Chamberlain Terraciture in terms of just completely denying the obvious threat that's in front of them This is also the first film that David Yates directed and this is it This is now the point of where we have got the Harry Potter Visual storytelling down because the visual aspects of the films will not change from here on out They have nailed down what they like is it exactly what I envisioned Maybe it is thankfully updating it for a more Obvious audience because these books were written during the 90s The first two movies really encapsulate the idea of the 90s. We're entering into the mid-2000s now So obviously the series needs to update itself and this is the point where they just they got it They pretty much got the visual style. Some people don't enjoy it. Some people do I think that it's what was necessary to keep the series going and thankfully they don't have to try and go through Any more visual changes because now they've got it and so now they can focus on the narrative Order of the Phoenix also has some of my favorite editing particularly when Harry is getting the whole Mind screwing at the end of the film where Voldemort's trying to enter his mind trying to take him over and just the very strange Visualizations through it like Harry seeing himself in the mirror as Voldemort Voldemort kind of on that green screen going I enjoyed this bit of editing and I think it really worked in terms of the film's Central themes which yes, they are beating over the head to you the amount of times that Harry is like And the guys are like, well, we're here for you Harry We're your friends this happens about three or four times and it gets a little nauseating at the end Also, I find it interesting that you never get a resolution with chow at the end We find out that she was tortured are Forced to give up information But Harry and her never really get a resolution at the end of the film Which I thought was a little weird you set it up, but you didn't finish the landing either way I think that order of the Phoenix while having a few Obvious things removed from the novel as well as kind of just being a very centralized film It is much more enjoyable than a few of the films in the series And it's a giant surprise to me because again, I thought this book just sucked I thought it was too long. I thought it was too depressing I thought it was just not entertaining at all I enjoy order the Phoenix in film form far more than I enjoy it in book form Thankfully, they have a very very great pacing. It's also an interesting change because the normal screenwriter Steve close did not Write this film. It was done by a different writer. So I don't know whether that had an effect on how the film was paced Maybe he was working on the latter three films. I don't know. I thought it was it was nice It just it moves very smoothly. It's probably one of the cleanest Harry Potter experiences in terms of just very Concise narrative good visual style and solid directing so in the end I'm gonna give the order of the Phoenix a five out of seven. I'm Yeah, it's pretty decent. It always surprises me when I watch it, which by the way also another little tidbit after God Little Fire came out and then the seventh book came out and I just hated the ending of the seventh book so much That I did not watch any more Harry Potter movies. I went cold turkey Completely, I never saw the latter four films in theaters and I admit I regret it because I've never seen anyone any theater do a marathon or show any of the films aside from the first one They never show the latter ones and I remember the lines for Deathly Hallows part two I remember them being around the theater block. That was when stuff like that still happened Either way, we'll come to those stories when we get to those films But otherwise, I hope you guys enjoyed this video if you did leave a like and if you're interested in more subscribe Harry Potter and the Half-Blood Prince is next. So see you guys next time Thanks for watching the video My name is Nits and you might remember me from the animated cult classic TV show undergrads It's been a while, but I'm happy to say the click is finally getting back together in an all-new movie Thanks to a successful Kickstarter campaign But we are still asking for your support to see any and all updates about the upcoming undergrads movie Be sure to check out and like the bring back undergrads Facebook page and with any luck. We'll see you guys soon


Fire Emblem Warriors at three hopes. A bit of a cringey name right there, but I get it. They want it to be obvious that it is linked to the same universe as Fire Emblem Three Houses. Now, this is a spin-off title from Fire Emblem with a different gameplay style from the mainline series, this being a Musou slash Warriors style game, meaning that you fight in real-time action combat against hordes of enemies at once. I was originally looking very much forward to this sequel of Fire Emblem Warriors, but I have to say that this one is different. It's just like when I reviewed Fire Emblem Three Houses, I said it was very different because I feel like both of these games, they are deviating away from what they are supposed to be, with all this extra stuff added that only ends up interrupting the flow and pacing of a game in this genre. What I'm trying to say is that it feels like it is trying to be several things at once, which often works in games, but maybe not in a Warriors-like game. This game was just released now in June 2022. It is developed by Omega Force and Intelligent Systems, published by Nintendo. I have a discount code for you guys. Eshoten on eshagaming.com gives you 10% off all Nintendo eShop cards. Story!  You come across the three leaders of the land and you end up joining one of them, hence the name Three Hopes, because there are three leaders of the land. And I have to say, the story is a very traditional one. It's warfare, war talk, politics. And I am not playing this game for the story, have to be honest. The story doesn't intrigue me. There are a lot of support conversations, which go deeper into everyone's personalities, day to day lives and hopes and dreams. Some of the characters are just stiff and crunchy when they talk. I mean, they say so many weird things. Whether I am resting, enjoying leisurely pursuits or simply in contemplation, I always apply all my energy to the task at hand. Some of them are very proper when they talk. I am not finding a lot of humor. And the little humor that I have seen, it does not stick with me. But like I said, story wasn't my selling point. I am playing this game for that gameplay. Gameplay. Now, this is a hack and slash game with two primary settings. You have the main hub area and you have the actual battlefields. The battle takes place in several war maps made out of enemy bases and forts for the most part, where you get to actively play as one of your teammates at any given time, with the option to swap between them, essentially making you able to play as anyone. Also, you can give your troops orders from the map, like defending or attacking certain areas, certain forks or certain NPCs from this map, which will be necessary. So this game is tactical. It's not just run and gun hack and slash boom, bam. You have to pay attention to your objectives. Who needs defending, which forts needs capturing, et cetera. Each battle can take anywhere between five and 15 minutes, I would say. And this is the actual part of the game I am enjoying the most, the actual battles. This is why I'm playing this game for the Muso part, the warrior style gameplay part. There are also side missions to tackle. So there's sometimes many things to keep track of at once, which is the whole fun factor of any Warriors game, if you ask me. For the most part, it is all manageable. And I find it the most fun to swap between my characters a lot. There are so many characters in this game, all of which you can get to know through these unlockable character conversations that you get when you increase their friendship levels, which you can do through fighting, training, doing chores together, gift giving, and these date-like events. Out of the three houses that you can choose in the beginning of the game, you get a certain roster of characters. Though you can later in the game choose to recruit some of the other teams to join yours if you want to. Now, in the camp area of the game, you can walk around and do all sorts of management, like there is a blacksmith, where you can level up and improve your weapons. A trainer, where you can train your troops, level them up with gold even, and change their classes, if you so would like. Anyone can be anything, so this is great to experiment with. A lot of customization options, that's for sure. You have the chore master, the supply master, and the battalion person, just so many people. So many things that you can do in this camp area. I use the fast travelling system when I'm in the camp, though, to quickly do all the things that I need to do, only to get back to the fighting as soon as possible, because I feel like there's just a lot, maybe even too much to do and keep track of. I just want to fight, you know? I have to say, there's so many unnecessary screens, though. So many level up screens. You can turn off the basic level up screens, but still, so many screens and pop-ups and dings and dongs. And even hitting the plus doesn't really skip much, I feel like, even though the pluses as a skip down there. But beware of hitting plus too much, though, as on the gold level up screen, I accidentally hit plus too many times, which means skip, but in the next second, it means reset all levels on this character. And guess what happened? My petrol fell down to level zero from level 27. Now this is a highly complex game, if you want it to be. It is not lacking in any game mechanics, let me tell you that much. This game has content. It has a lot of systems and customization options and just all this stuff that you can delve really deeply into. I have to address, in the gameplay section, that a Muso Warriors game like this can be known for, and I'm sure you've heard about this, can be known for repetitiveness. It is the thing that goes across all of the games in this genre. It can be repetitive. You do a lot of the same stuff. You hack your way through everything.  And even though the classes add some variation to the gameplay, like playing a mage, someone on horseback, swords, axes, bows, etc. It is pretty much the same and it can be repetitive. Now, I don't find it repetitive, but that depends on what kind of gamer you are actually. I tend to like Muso Warriors games. And if you do too, you know exactly what to expect from this title. Well, graphics and performance. Now let's start on the battlefield. In my time with this game, I didn't feel the scenery varied much. The enemies are pretty much brainless, standing stillers, and it is not a graphical masterpiece by any means. However, the actual characters look great, the fighting animations are cool, and the frame rate is acceptable for the most part. But in the camp, it is a somewhat different story. You know I don't know what happened in the camp area of the game. It feels like a different game sort of. There's something off with the camp area. It looks like a 2012 game in 2022, in its graphics. It just doesn't look like a 2022 game at all. Not even to mention the rather huge and distracting hub elements to taking huge chunks of the screen in this area. There's just something off with this area. The loading screens are short and sweet though. Can really appreciate that. But I mean it is what it is. It is after all in the battlefields that the graphics and performance matters the most, and the battlefields they are for the most part okay, but I would love to see more variety. Music and voice acting I guess. I have no real complaints on neither the music nor the sound effects of Three Hopes. The sound work is excellent. The voice actors varies in their quality of their performances though. For example, I like the main protagonists voice acting a lot, while maybe others were more mediocre. But at least there are a lot of voice acting in this game. I have played so many games where there's just minimal voice acting, where I wish it was more of that. I feel like there is plenty in this game, both in English and in Japanese, should you like so. It sounds very fire emblemly, and I've always just liked and enjoyed Fire Emblem Music and sounds. Just fire emblem me. Verdict. I think it is fun and I like it. There are some things still though that I liked more from the first Fire Emblem Warriors title, like for example the World Map. I much more like the simplicity of that, and the story was actually more captivating to me also in the first one oddly enough. Now this is a must have title for fans of either series I feel like, both the Fire Emblem series and the Warriors series. And if you have played a game just like this before you know exactly what you're getting into, and if you have never played a Warriors Musou game or anything like that, why not start here. It is personally pretty much an 8 out of 10 game, because I knew that I would like this game, as I like the first one so much. There's plenty of things to do. There's even an in-game achievement list that I haven't even looked properly at yet. But I could also say that if you find the first game for cheaper I would maybe say go for that one. I think I like the first one more still. This is also good. But you know that is just me. Probably just me. Could be nostalgia talking also for all I know. It's a really fun and satisfying Musou hacky slash why a button mashing game guys. You mash the why button so much. Now don't forget my code ISHA10 on ishagaming.com and get 10% off the entire Nintendo eShop essentially. Listen to my podcast and please hit like on my video that really helps out. Thank you so much for watching and I will see you later.


Hello, Dibbidi Dan. My name is Christian Hilchi. I teach check at the University of Texas at Austin. I'm also the author of Reality Check. Reality Check is an open check curriculum that I designed here. It was actually something that I was hired for in addition to teaching check language classes. We wanted to create a textbook of check that would not only be used here at UT, but that would be available to anybody in the world to use. So Reality Check is actually a textbook that's under an open license, meaning that anybody can use the materials, share them, they can modify them, etc. And it's completely free. So there's no high costs associated with buying a textbook for your class. And individuals who are maybe interested in taking check or learning a little bit about the check language can just open it up on their web browser and utilize the materials. Now when I started the project, I really didn't actually know how big the project would end up being. And as you can see from some of these numbers here, it really ended up being a huge project. So just the online grammar and cultural lessons are over 850 pages. There are nearly 500 Canvas quizzes. There is an activity book that numbers over 500 pages as well. Workbook with homework that is over 270 pages. I created more than 245 interview videos, math videos, and tons of Quizlet sets for vocabulary learning. Now I'm going to be talking about all of these aspects today. And I'm going to be showing you how you can access them yourself, whether you're taking the course at a university, you're interested in teaching from materials, or if you're just interested in using these materials from home. So as I was mentioning before, this is an open educational resource, or OER. And the cool thing about OERs are what freedoms they give us. So when you buy a textbook, you are able to just have that textbook for your use, but there's no real freedom for you to be able to, for example, reuse that material, or share it with others. You can't revise those materials, and for example, create your own version of them, and share it with others, and you can't mix it with other things. And these are some of the things that OERs give us the freedom to do. This ultimately ends up being somewhat of an issue. For example, a checked textbook is created, or a textbook for really any subject, and then the author moves on to some other project, and the textbook never gets updated. The goal of this project was not only to create something that gives users a lot of freedom, and how they use it, and something without any cost, but also something that lives on after I have decided maybe to work on something else. So the hope with this is that this is a textbook that will exist on, and will ultimately inspire others to take parts of it, maybe modify them, and then continue to share those with others. This is how you will typically access RealityCheck if you go through the website. This is, for example, what a table of contents for Unit 3 looks like at the top. And one of the cool things about the textbook is I really wanted to make sure that it was accessible in whatever format is most convenient to users. So you can open up documents in Google Drive, you can actually save it to your Google Drive as well, and create your own copy that way, and then modify it any way you want. You can write your own notes in it. You can download it as a PDF if that's your favorite way to consume the content, or as a Word doc. So really the idea was to have as much freedom for the content as possible. Now the project itself was sponsored by the Center for European Studies, as well as the Department of Slavic and Eurasian Studies, my home department. And I worked extensively with Coral, the Center for Open Educational Resources and Language Learning, a really wonderful center here at the University of Texas at Austin that helps instructors create and share their materials using open licenses.   I tend to avoid them, but I keep running into reasons to use them. And in fact, actually when I was hired for the job, they asked me, what do you think you'll call this book? And I said, anything but a check pun, and of course that's exactly where I landed. But there was actually some pretty good reasons why I chose the title Reality Check. The first part of it was pretty early on in the project, I figured out that it would be really good to have reality style interviews, interviews with a lot of different checks. And they'd be answering questions for each of the units. And as I was putting them together, they really felt a lot like the kind of interviews that you get in a reality style TV show. The unit questions, these are available, every unit in the text book has a set of questions associated with them. These are just some of the questions, for example, for the food unit. These are basic everyday questions that you would expect to be able to answer. What kind of food do you like? What do you like to drink? What's your favorite cuisine? What do you often eat? What do you ever eat? Do you drink coffee or tea? Do you know how to cook? Do you like to cook? So the goal of the course is to learn how to answer these questions in check. And so that involves learning a lot of vocabulary, grammar, structures, and also learning a lot about Czech culture. And so these videos, these interview videos, here's another example of one. The question is, what do you do when your head hurts? Does my head never hurt? Not at all. Fortunately, my head doesn't hurt very often, but probably the best thing is to drink water.  When my head hurts, I start drinking a lot of water. Do you have any powder? If it doesn't help, I take some powder. So if we look at this video, it was a collection of different native speakers answering the question, what do you do when you have a headache? And so this is really important because our students also want to be able to say, what do you have to do when you have a headache? The speakers give all sorts of answers. For example, I never have a headache or when I have a headache, I take some sort of pain pill or I drink water. Really a great opportunity for our students to learn a little bit about Czechs, as well as also how to say these various things. This notion of reality, however, started to take on deeper meanings. And I started to think about how we also really need to focus on some non-normative or non-canonical aspects of Czech language and culture. And the big thing with Czech in terms of language is that a lot of the ways that we focus on teaching Czech and this is something we see over and over in Czech textbooks is there's this huge focus just on learning the endings and learning the standard endings, etc. This is not necessarily always, however, the case of how people speak. So they don't necessarily use all these endings or the precise endings, etc. Additionally, Czech is what's known as a high variety and a low variety of the language. Basically, everyday dialect and the standard language. This complicates matters because people rarely actually speak using standard Czech. They tend to use a lot of their own dialect forms. These are things that were coming up in the interview videos that I filmed, as well as more videos that I found, for example, on YouTube and other sites, which I'll talk about in a little bit. So the goal really was maybe we should not necessarily just focus on the standard, but we should also expose our students to the everyday variety of Czech that they're going to encounter whenever they meet Czechs. Additionally, I came into this project really thinking that the most important thing was we need to learn all of the grammatical intricacies of Czech. What I'm showing you here is this very initial outline of what was going to be in the project. And as you can see here circled on the left, grammar was number one. It was really for me this goal to make sure that we got all the important grammatical points. But this isn't necessarily how we learn language. We really use language as a tool to achieve goals.  And so really it was about actually sort of focusing in on what actually do I need to learn to be able to achieve the goals that I have. And as I stated before, the goals of this course are being able to talk about yourself and people in your lives. And specifically about answering these questions related to that. So what do we actually need? What tools, what vocabulary do we need to actually achieve those goals? And I really started to realize that reality is actually a lot of the things that you can find on YouTube, the sort of everyday life that is represented by checks that are going on there and just talking about their daily activities or their opinions or whatever. Additionally, as I said before, reality is looking at how checks actually speak. Really focusing on that and not necessarily focusing on some sort of preconceived notion of these are the topics that we have to have. These are the grammar things that are important to cover in a first year check language classroom. So the curriculum is organized into 10 chapters. Currently, I actually only do the first eight chapters in the first year of check. The additional chapters were planned for the first year. But I found that I had created so much content already just in the first eight chapters that that's all we could really manage to get through in that time. So there are two extra chapters. Some additional chapters are planned and are currently in the works. But for now, those are the 10 chapters that are available. And the way that the courses is organized is as a flipped classroom. This is an example of blended learning. So a flipped classroom basically takes a lot of those aspects that are traditionally maybe part of the instruction in the classroom. And instead puts them before you actually even meet for class. So the course is actually broken up into a pre-class and in-class and a post-class component. So the pre-class component is what you would do, for example, on Sunday evening before you go into class on Monday. When you get into class on Monday, there's in-class activities.  So it's all part of this grand strategy to prepare you for class, to get you in class working on a lot of those concepts and communicates a lot of those ideas that we want to communicate. And then post-class really gets you to build on those skills that you learned in the pre-class and the in-class components. If you were to click on Unit 1, for example, and go down, you would find how these three... If you want to find more information about how the course is organized, you can go, for example, to any of the units. Here we're going to look at Unit 1. And if you were to scroll down a little bit, you would find a description of the pre-class, in-class, and post-class components. Additionally, if you want more information about how to use the materials, you can read Using the Reality Check Curriculum, which I've put an arrow to down here at the bottom. So pre-class components, introduction to new vocabulary, various quizlets to help you learn the vocabulary, grammar explanations, culture, and canvas quizzes, which help take all those things that you learned and give you some feedback. Did you actually understand them correctly? And the advantages of having this pre-class is that you can take as little or as long as you need to learn the various concepts. You can repeat things. So every canvas quiz can be repeated multiple times. You get that immediate feedback. Do I understand this or do I not? I also get feedback as the instructor, if you're in my class, for example, and so I can see, well, how well did you do? Maybe we need a little bit more time in class to review those concepts. And then as a sort of eventual goal, it'd be really cool. And I say this as something that actually doesn't exist yet, but it would be really cool in the future to have individualized assignments for certain students who need some extra help, for example, with a concept, whereas maybe other students are understanding it pretty well and so that they can actually be pushed a little bit further. So here is an example of what pre-class looks like on Canvas. You can see all of the various aspects of the course have been laid out. And then if you access the materials through the course website, realitycheck.org, you can also see the pre-class components here on the left. Now, one of the other aspects is that Quizlet is used really extensively in the course, whether for flashcards or learning exercises, or various listening or matching exercises, et cetera. It's a really cool resource that I've added to make sure that every student has the opportunity to really practice all those things, especially vocabulary, all the new words that you're learning and not just have to go off of some long list. Additionally, I teach grammar and culture in these pre-class lessons. So here you can see learning various vocabulary items, learning how to tell time, or learning how to talk about what subjects might be enjoyable to you in school. As I mentioned before, there are Canvas quizzes. These are ways of checking your knowledge, whether it's multiple choice or fill in the blank type exercises, true, false, et cetera. Typically the kinds of things on here are things that can be auto graded, and so you get immediate feedback with them. So, when you get into class, the in-class components often involve some sort of speaking activity or some sort of game, et cetera. I've created lots of opportunities for instructors to go, and for example here, if you see 4.6a, this is Pexsesso, a matching game, right next to it you can see download a set of cards here, or if you look at the exercise here on the right, for a slideshow with even more photos click here. So the idea has been to provide instructors with all the resources that they would need to create a successful classroom. The in-class activity book also uses a lot of videos. You've already seen a lot of pictures being used, but also videos that were made available on YouTube using an open license. Here's an example of a girl showing three different work outfits that she wants her viewers to be able to rate, which one do they like the most, which one they like the least, and this was a natural opportunity, for example, to get my students or anybody who uses these materials to basically do the same task, give your opinion on these outfits, and so that's what we do in class. What outfit do you like the most, what outfit do you like the least, and why? And of course, checks like to talk about all sorts of topics out there, for example, chocolate addiction and what kind of chocolate you like the most. These are fun little topics to bring up in class. It gets people wanting to speak and really express themselves in the language. Now post-class, as I said, this is building upon the pre-class and the in-class, and it gives a lot of opportunity for active use of the language and creating with the language and reinforcing those skills that we learned in the pre-class and post-class, sorry, pre-class and in-class. So the post-class is typically found here on campus under post-class, Domazzi Ukol, homework 3.1, for example, and if you're looking on the course website, you'll find it to the right here, Domazzi Ukol as well, homework. These are homeworks that are available as Google Docs and printable, and so you can print them and fill them out and then turn them into your instructor or submit them online as an electronic document. Post-classes often involve, as I said, more opportunities to create with the language, whether it's answering questions about yourself or here's this activity in the middle, which gets you to write a postcard to friends or this activity on the right which gets students to talk about or write about who should hang out with who based off of common interests. It's also really important to utilize check language materials available over the internet, such as stores. We don't have to be in Prague to go into a check store. We can access this through our web browser. This is just one example of an assignment that gets students to go onto a grocery store website, in this case Tesco, and put items into their cart, plan a meal, and see how check items are sold, how they're described in check, etc. One of the things you've probably noticed is that there are a lot of images used throughout this course, and I really took advantage of the availability of a lot of openly licensed images, whether on Flickr or Wikimedia Commons or a host of other sites. Images are really important because we're learning lots of vocabulary and grammar, and we need to be able to connect those things to the concepts that they help describe. Pictures are that missing link, they're that really important thing that help connect those two together, and so I use them as much as possible. And I not only just use them as illustrations, but also let's have some fun with them. I created meme-like content using images to help learn words and phrases, and sometimes we can use this kind of content in a fun and playful way to learn grammar. Just one example, the third person plural that they form of to eat is a regular, yeti, but it looks like Jedi to everybody.  Or the way that we say I like to sleep, or my head hurts in check, is a little different than we say in English. So some of these memes take advantage of that. Let's learn how to construct some of these concepts in check in a fun way. I also created a number of check cultural videos. These are largely revolve around various locations in Prague. I believe right now there's about a dozen videos. These two, one is on John Lennon's wall in Prague, and another one is a pretty popular restaurant, lokal bloha. And so these are really cool. They allow you to go on a map and click on various places and get a short video about that location. I also, as I've mentioned before, utilize a lot of video content that I found on the internet. So much of this was actually through vlogs. Vlogs or video blogs are really great, and they offer a lot of advantages to language instructors. What's cool about them is they're really a natural context for the speaker to be presenting information to their viewers. They address the viewer directly, and in a really natural way, because this is a natural way of communicating with people on the internet, we naturally view a lot of videos like this. This is normal now in our lives. These users typically are really passionate about their subject matter, and oftentimes the quality of the video is quite high. As a side note, you will have more content if you're a language instructor interested in creating content like this. There's more content than you could ever imagine doing anything with. So I really highly recommend these. When I found out about this, I immediately started to look at the users that were creating open videos and found that they tend to have so much content that it really will fill a whole page and more. So this had to become part of the curriculum. And there's a whole number of genres that really can be used from the very beginning. Here's just one example of a drone video. Drone videos give us not only a view of Prague, but they also let us practice vocabulary that we've been learning, describe things that we see, practice plural, practice descriptions, etc. So I really try to take advantage of these as much as possible. Whatever is available on the internet, whatever has been available to me to use freely under an open license, I've tried to integrate that into the course in a meaningful way. And so it was throughout the process of creating this textbook that I really started to learn to think open, open my mind to what I can do with the materials available to me, the pictures that I would find that are under an open license, the various videos that had been openly licensed on YouTube or Vimeo. And instead of having a preconceived notion like the table I showed you at the beginning with all the grammatical concepts that I thought were important, instead, look at what's out there. See what is important, what students will actually need to do to achieve the goals of asking and answering those questions about themselves, people in their lives, etc. When I learned to do that, I think is when I started to create a really effective textbook. And I like to liken this to a farmer's market. You may go into a farmer's market with some sort of preconceived notion, an idea, a recipe that you'd like to create. But when you get there, the vegetables that you had planned on maybe just aren't there that day. Maybe it's too late for tomatoes, the season is over. But you find some really fantastic other varieties of vegetables, cauliflower, cabbage, carrots, leeks, etc. In that kind of instance, what you can do is take those great ingredients and create something out of them. And that's what I try to do with this curriculum. So I hope you'll take a look at the reality check curriculum. There are a lot of materials here to learn, check, or if you're an instructor to teach, check with. If you have any questions, please feel free to reach out to me. And I hope you enjoyed this video. Thanks a lot. Goodbye. And that's good to know.


They can be used to provide relief from pain, promote healing, and protect the cornea from environmental factors. Rigid gas per mable scleral contact lenses are particularly effective in treating certain ocular surface diseases, such as bolus keratopathy, corneal epithelial abrasions and erosions. This article was authored by Namrata Sharma, Ram Kishore Sai, K. Pridarshini, and others.


What we have seen is how do we, what are all the different information which we can input and how you can have it on a same scale or a scheme level and how you will be able to use the GIS for creation of different kind of maps which we have related to agriculture that is water, water storages and other activities. Now there is one more activity which we can do is, it is buffering is. So buffering is nothing but around a point, around a point what are all the objects which are in the nearby areas. So this is useful, suppose here what in this and this is also known as a proximity, so you have a road and how many houses are there within 10 or 20 meters on both the sides of the road, 10 meters or both the sides of the road. So this type of information is needed when you are talking about environmental issues, you have many other issues which are related to this type of things. For the agriculture purpose, what are the things which we can do is, there are certain traditional lakes and these are all the lakes which you have extracted from the different sources that is topographic sheets as well as from the imageries and then it has been brought into a composite mode. Now my interest is these lakes, how many lakes are there in a particular village, so that is the issue. So if it is one, at least one lake should be there which can be developed and people can get water from that particular source. If it is a lake adjoining to covering both the villages, then what happen is these two village people they can maintain this lake and get their water supply from this type of lakes. So this is the type of utility which we will be able to do that. So any, so this is, one is public funding and governmental initiative and another thing is the village based initiative. So if both the things, if they come together, then what will happen is then water for the agriculture, water for the drinking purposes can be solved to some extent. I am not saying that it is totally completely joined because it varies from geography to geography and mentality of the people that is mental means social aspects of the people that is what is more important. So now when you look at it, so except this, this area, this village, except this village, so all other villages they have got some smaller or a moderate or a bigger lake. So they are all, they are all see now what I have given is, I have given 200 meters as well as 500 meters from the lake periphery towards that area. What does it indicate? This indicates people can walk about if they walk around 250 meters or 500 meters, they will be able to get a water source for the drinking purposes. So this type of buffering analysis is possible from the basic layers of the GIS. Now other important things which we can do is geostatistics and you will be able to do many things. Then interpolation is another issue. Sometimes what is happening is in some of the areas, there may be some data gaps. Suppose if you have a one point, one information, you have another information in between the information is missing either in time mode or it may be in a distance mode. Based on the adjoining points, you will be able to have a gradient, you will be able to extrapolate and then fill up these points with reference to the adjoining. That is what the interpolation means. So what is the digital elevation? Digital elevation is nothing but giving a three-dimensional picture of a particular area which I will be showing it to you, how it is done and how you can, it is only a viewing purpose which we are of interest. So now second thing is the geocoding. See geocoding is calculating the spatial locations that is x y coordinate from the street addresses. That is also important in some of the areas. So this will be for pipelines and the drinking water supply sources, those guys they will be interested. Now what are all the outputs which we can get from this GIS? So now okay I have just taken out all the old records, I have converted into a digital mode and I have used GIS and everything is in the digital format, okay right that is fine. But how do I get a result and how do I show it to people? So okay now there are ways which you can do that. One thing is a visual in the form of a map as well as in the form of a visual representation. It can be on a screen, I can take it out and then show it to people on the screen as well as you can do it on a print it on a paper mode. So then as well as you can have a wall maps with the colorful wall maps which you will be able to express whatever you want to do that. So otherwise the third option now is you can just facility map servers and you will be able to generate and then you can put it on the websites, okay. Now another graphic display disc techniques which I was talking about is the perspective view so that what you want to do that. So how it is different from the normal thing is, so what is it? You would be able to see, I do not know that it is looks like a hill somewhere it is high somewhere it is down. So how did I generate is, so this is the digital elevation mode and wherein you have given a three dimensional approach to those layers. So now instead of in a plain map what you will be able to see you are able to write only the hills, valleys and things like that whereas hills and valleys are not going to be helpful in a long term portion because perception you have to create a perception of the people. Now what I did was this is the digital elevation model so what over that what I did was I have just draped over the images satellite images. This satellite images is some of them these are all the cloud patterns which is observed on the particular day and that is the direct first what I did was I tried to take that image and then I have georeferenced it and these two georeferencing of the DEM as well as the satellite data they all I have just registered with each other and draped over that that is the first thing I did it. Second thing which what I did was these are all the drainage lines and this is the river course. So this is I have created as a separate layer and that layer also I tried to drape over there. Now fourth one is these are all the road network location also I had draped over there or overlaid it. So now I have the elevation, I have the land cover surface features as evidence from the satellite, I have the road network, I have the drainages. So all these things as you see it as you when you go with this type of information over there you will not find any difference between what you have created and what is available over there. Your plan your management problem your execution problem will be easier otherwise on a normal mapping system and these type of things are not available. So whether it is a valley or a hill that we do not know unless you give a elevation thing. So that type of totally integrated picture can be created and created for any analysis. Now how can we use this? The next question will be how can you use it? Now I want to have one more dam where do I do that? So if you have a dam here is it possible? So if I have a dam then how do I distribute water? If I have to if I do not get a ground water on the top so I have to have a ground water is potential is over here. So I can take these pipelines up. So these type of ancillary the questions which you which arise after seeing those activities so those things can be cleared up by this type of method. This is what you try to call it as a perspective map from one side. So can I rotate it and then see? See now what is happening is I am not able to see the other side of it and now I am looking it from one side. So can I do it on the other side of it? So in this way what now what is another thing I have tried to do is and I have tried to create a DEM in this DEM these are all the areas where ground water is available more likely to be available more. Now I have tried to have a ground water potential map which I would show you later. So that has been that has got a different constraint and this has got a better advantages. This better advantages is suppose if you have a ground water potential on this higher areas so what happen is the elevation is very higher. So your possibility of getting the waters from these areas are negligible even though the aquifer conditions are good. So this type of co-evidences which you will be able to get a better picture as well as the appreciation. What I tried to do was the same information I tried to rotate it from here to here.  So I am trying to rotate it in all directions so that what happen is when I look from here I do not get a view of this area when I look at it I do not get a view on this area. So like that when I start rotating the same information the same perspective view in a different way so whatever the shadow region whatever which I am not able to see that those information I am able to get it which you will not be able to get it on a normal mode.