Reuse Playwright Code across Files and Tests with Fixtures

Поделиться
HTML-код
  • Опубликовано: 2 фев 2025

Комментарии • 97

  • @OlgaTheKey
    @OlgaTheKey 11 месяцев назад +4

    omg that is the one I needed so hard, cool explanation, because I literally bored with all setups and imports due creating student's project. ty

    • @ChecklyHQ
      @ChecklyHQ  11 месяцев назад +1

      We're very happy that this video has been helpful! 💙

  • @3VAudioVideo
    @3VAudioVideo 11 месяцев назад +2

    Wow! This was great! So hard to find good Playwright videos like there are for Selenium (Java, C#, Python). A few videos are out there for creating setup and teardown, but they are in the same file as the testcases are. Your video went at a good face pace and while watching it I started to notice it was about to end. You didn't yet show how to put the code in a separate file so I thought it wasn't going to be covered , but you covered it! Thanks so much!

    • @ChecklyHQ
      @ChecklyHQ  11 месяцев назад +1

      Thank you for the kind words. Happy the video has been valuable. 💙

  • @owcaandroid
    @owcaandroid Год назад +1

    My God this is what I was looking for! That's funny because I didn't find this clip at once, I stumbled on the clip about parallelism because google pointed out me that topic for my question. Thank you very much, your examples are very clear and straightforward

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      Happy you found it after all. :)

  • @robertrobles7698
    @robertrobles7698 10 месяцев назад +1

    Straightforward and useful explanation. Thank you for sharing!

    • @ChecklyHQ
      @ChecklyHQ  10 месяцев назад

      Glad it was helpful! 💙 Thanks for watching!

  • @rossfisher5543
    @rossfisher5543 Год назад +1

    It would be great to see a video that matches with your article on the performance api. Great video!

    • @stefanjudis
      @stefanjudis Год назад

      Thanks Ross. I'll put it on the list for the future videos. :)

  • @NikoNiko-q1i
    @NikoNiko-q1i Год назад

    Great example, helped me a lot, other videos from people have a lot of useless info. But your example is super!

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      Thanks! Happy it's valuable! 🦝

  • @sayeddanish
    @sayeddanish 4 дня назад

    Awesome video.. I really like the font that you are using.. may I know the which IDE and font you are using?

  • @Mike606S
    @Mike606S Месяц назад +2

    can you name it not webApp but just page? Or it should be different from what playwright already has?

    • @ChecklyHQ
      @ChecklyHQ  Месяц назад +1

      Yes, you can also overwrite the default `page` fixture by using the same name. :)

  • @thiagofragoso6471
    @thiagofragoso6471 Год назад +1

    Thanks for sharing this content. quick and assetive. May I ask you whats the theme are you using on this video? thank you

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      The color theme is Yi Dark and if you're after the custom font it's described in this article 👉 www.stefanjudis.com/blog/how-to-enable-beautiful-cursive-fonts-in-your-vs-code-theme/

  •  Год назад +2

    which extension are you using to see the await text on handwriting font ?

    • @ChecklyHQ
      @ChecklyHQ  Год назад +1

      The editor setup is described here: www.stefanjudis.com/blog/how-to-enable-beautiful-cursive-fonts-in-your-vs-code-theme/

    •  Год назад

      @@ChecklyHQ thanks so much

    • @bgd_surf
      @bgd_surf 10 месяцев назад

      @@ChecklyHQ thanks u rock!

  • @glebmirosnikovs6722
    @glebmirosnikovs6722 4 месяца назад +1

    Nice tutorial, thank you.
    Have one question. Currently on project we have POM and UtilClass for common methods we use. And usually I just create method in POM and then I can re use it in my test files.
    Looks like creating custom fixtures is more or less the same as storing method in Page Object file and then execute it if needed.
    Or are there any other advantages of using custom fixtures?
    Thanks

    • @ChecklyHQ
      @ChecklyHQ  4 месяца назад

      Yes, this is correct. There's nothing particularly wrong with importing utils/poms within your test files. But I found that by relying on fixtures a project becomes more structure and does things "the playwright way". One advantage is that if you're using classes that need to be initialized you can hide this and don't neet to care about it. :) 👇
      ruclips.net/video/k488kAtT-Pw/видео.html

    • @glebmirosnikovs6722
      @glebmirosnikovs6722 4 месяца назад

      @@ChecklyHQ Thank you for your reply, appreciate it! Speaking about initializing classes... we already hide them with pageManager. There is a function, that returns class object, so we call that function in test file.
      I agree about "the playwright way". Looks like there are few ways to achieve same result. Agree, that fixtures look nice.
      And thanks for sharing your tips and playwright insides. Before fixtures were unclear to me... but now I understand them a bit better. Thanks for your effort!

    • @ChecklyHQ
      @ChecklyHQ  4 месяца назад +1

      @@glebmirosnikovs6722 Oh for sure - there are plenty of ways to abstract things. :) Playwright is also just JS/TS at the end.
      Happy to hear that the videos have been valuable. If you have more questions or comments, I'm always looking for new ideas. ;)

  • @romag5605
    @romag5605 5 месяцев назад +2

    how can I use parameterized fixtures ? for example I want to make a login fixture but to pass username and the password to this fixture . can I ?

    • @ChecklyHQ
      @ChecklyHQ  4 месяца назад +1

      This is a great question and I think I'll record the answer today. :)

    • @ChecklyHQ
      @ChecklyHQ  4 месяца назад +1

      And here we go: ruclips.net/video/rRmfYu8hlbw/видео.html 😊

    • @romag5605
      @romag5605 4 месяца назад +1

      @@ChecklyHQ thanks, before I saw it , my solution for this was global params like: process.env.userName

  • @guillaumebrunerie
    @guillaumebrunerie 2 года назад +3

    What’s the advantage of using a fixture as opposed to a regular function? You could simply define
    const login = async (page) => {
    // Do all the stuff
    }
    and then simply call `await login(page)` at the beginning of the test.

    • @stefanjudis
      @stefanjudis 2 года назад +4

      That's right Guillaume and a great question.
      In this simple example scenario, a helper method definitely works. 👍
      Fixtures enable you to follow the PW conventions and group helper/utility code like the framework does. I consider this to be a great advantage.
      Additionally, and considering your example: if you'd want to perform a teardown action (maybe you want to log out after) you'd already have two methods to pull in every test case and the number of util functions grows. With a fixture-based approach, you could put setup (before the 'use' call), the action and teardowns (after the 'use' call) into a single place.
      Hope this helps. :)

  • @luke1023
    @luke1023 Год назад

    Love the videos, they’re very helpful and love your energy!

  • @kundansharma6536
    @kundansharma6536 3 месяца назад

    Thanks for such a great explanation. Just wanted to know why page is getting cleared if any of the test cases in a describe block failed. Is there any way to handle it?

    • @ChecklyHQ
      @ChecklyHQ  3 месяца назад +1

      Thanks. :) I don't understand. What is cleared? Please provide as much context and code as possible (GitHub gists are great) because otherwise it's very tough to help or answer questions. :)

  • @gruttewibe76
    @gruttewibe76 Год назад

    Very good explanation on the topic.

  • @karthikeyan.ganapathy
    @karthikeyan.ganapathy 2 года назад +1

    Thanks team for quick video, you guys are great

  • @Danielo515
    @Danielo515 8 месяцев назад +1

    How is this different from a function that takes the page and executes the same operations than the fixture ?

    • @ChecklyHQ
      @ChecklyHQ  7 месяцев назад

      Nothing wrong with writing your own abstraction. 👍 Fixture are just the more native way of doing things. :)

  • @Cowglow
    @Cowglow Год назад +1

    Such a beautiful feature!

  • @powertester5596
    @powertester5596 Год назад +3

    Hi, I have started exploring playwright very recently and found your videos on the topic . Kudos for creating these :-). I have a question. If there are more than one reusable functions to use inside the test, how do you do it then?

    • @ChecklyHQ
      @ChecklyHQ  Год назад +2

      Custom fixtures aren't bound to a single one. You could add more if you wanted to. :) Add more properties to the `extend` object and you're good to go. :)

    • @powertester5596
      @powertester5596 Год назад +1

      @@ChecklyHQ cool. Thanks for the reply :-).

  • @ripperx444
    @ripperx444 11 месяцев назад

    What if you want to have two fixtures in differnt files... you can't import them as they are extend test

    • @ChecklyHQ
      @ChecklyHQ  11 месяцев назад

      You could always structure your project to use different fixture with different exported `test` object. And depending on the fixture differences you could also make fixtures configurable with fixture options. It's a bit tough to give advice without knowing specific. :)

  • @TristanBailey
    @TristanBailey 10 месяцев назад

    How would you see that as different from just using .before that will already run before every test. (Or login session is better put in config where playwright has options for putting it per project/browser or for default of all. Saving in a json file. )

    • @ChecklyHQ
      @ChecklyHQ  10 месяцев назад

      It depends on the case I'd say. If you have a single `spec` file before/after does the trick for sure. And also, when it comes to saving the login logic, you also make a valid case buy saving the browser state.
      All that said, I often prefer fixtures, because they "hide" functionality from my spec files. I don't have to worry about fiddling with before/after or anything. Additionally, I can also configure them with fixture options. Implementing fixtures just feel like a "native Playwright approach". And I like this a lot.
      But, of course and as always, it's a classical "it depends" and a matter of taste. ;)

  • @chandanchoudhary8630
    @chandanchoudhary8630 Год назад

    Great stuff , Thanks , but how can we utilize this is page object model and maintain the same page state as page instance will be different hence different instances will be launched , can u plz show , thanks

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      That should definitely be possible. I'll put it on the list for future videos. :)

  • @gdd546
    @gdd546 5 месяцев назад

    Do you have a course on playwright framework design?

    • @ChecklyHQ
      @ChecklyHQ  4 месяца назад

      No, unfortunately we don't have and are not planning to create a course on that. :/

  • @salikhanan
    @salikhanan Год назад

    Hello,
    How can you return something form Webapp fixure? I am trying to copy text from text field on clipboard and then eceluate it and return it to my test,

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      This doesn't sound like a fixture case for me. I'd instead extract the logic into a separate function for the case of evaluating text in the clipboard. That said, you could always change the fixture to be a nested object or a function. It's up to you what to call `use` with. :)

  • @justaskiekas
    @justaskiekas 2 года назад +1

    Awesome video

    • @stefanjudis
      @stefanjudis 2 года назад

      Thanks! Happy it was useful! 😊

  • @salikhanan
    @salikhanan Год назад

    Hello, my API test creates an access token and I want to reuse that access token in other tests, How do you do that?

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      You can create a similar fixture called "accessToken", do whatever needs to happen to access the token and then pass it to your tests via "use(token)". Hope this helps. :)

    • @salikhanan
      @salikhanan Год назад

      @@ChecklyHQ ok, Thanks, That was a quick help. at the same time another question
      I have json(playload) stored in a file and I want one Field (RefNumber) has a random value every time How can I provide a random value every time to the RefNumber in json? for exmple in follwing workOrderPayload is the work load and I was to provide RefNumber as a random to the Json everytime
      const response = await request.post(workOrderUrl, {
      headers:{
      "Accept" : "application/json,
      "Content-Type" : "application/json
      "Authorization" : `Bearer ${process.env.TOKEN}`
      },
      data: workOrderPayload
      })

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      @@salikhanan I'm not sure I understand. Could you use `Math.random()` and alter `workOrder` to include a different `RefNumber`?
      That said though, let's stay focused on this video here. :)
      For questions around synthetic monitoring with Playwright and Checkly we're always happy to help at checklyhq.com/slack/. :)

    • @og4789
      @og4789 Год назад

      Try native Authentication solution from Playwright well described in the docs

  • @danielkovacs3664
    @danielkovacs3664 Год назад

    thanks the videos
    Is there possible that we use different storagestate inside one test between test.steps? e.g.: test.step.use({storageState: '1.json '})... test.step.use({storageState: '2.json '})?

    • @stefanjudis
      @stefanjudis Год назад +1

      Hey Dániel, I just had a look and I don't think that's possible. But if you're testing your sites with two different states (such as a regular and admin one) I'd also favor fixtures.
      `test('something', ({page, AdminPage})`
      Hope this helps. :)

    • @danielkovacs3664
      @danielkovacs3664 Год назад

      @@stefanjudis thanks, i am doing this now,
      my test
      login admin...
      logout admin
      login editor...
      logout editor
      login admin, that i can delete the item
      what do u suggest how could i avoid so much login,logut?

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      @@danielkovacs3664 Hey Daniel, in this case I'd login admin and editor so that you don't have to switch and log in/out all the time.
      Similar to this: `test('something', ({page, AdminPage})`
      That said though, here at checkly we have a good experience with cleaning up created resources on the API level. blog.checklyhq.com/how-low-level-api-calls-stabilize-your-end-to-end-tests/

  • @alexalexander4326
    @alexalexander4326 2 месяца назад

    Custom fixture is designed to extend basic fixtures. In your example you misuse it and normally this isolated repeated set of calls should go into a separate class (POM)

    • @ChecklyHQ
      @ChecklyHQ  2 месяца назад

      Thanks for your comment.
      "Custom fixture is designed to extend basic fixtures." -> Can you point me to where you have this from? I'm happy to be convinced but I don't think this is true. Fixtures can be used for much more than extending the included base fixtures.
      "This isolated repeated set of calls should go into a separate class (POM)" -> I can understand this opinion, but the question of "to POM or not to POM" isn't more than a personal preference. If POMs work great for you, wonderful, but I wouldn't (and in fact won't) recommend using POMs for everything. Using POMs often only increases complexity, which is also the case for this quick demo example. 🤷
      This video aims to be an intro to Playwright fixtures, and I think it does a decent job at this. :)

  • @karthikeyan.ganapathy
    @karthikeyan.ganapathy Год назад

    is there a way we can enable and disable the fixture based on run time values like flag to enable or disable?
    Scenario: if the login/SSO is required for higher env's and not for lower env

    • @stefanjudis
      @stefanjudis Год назад +1

      Enabling and disabling fixtures doesn't feel right to me. I'd rather make the fixture behave differently depending on run time flags. :) Hope this helps.

  • @sxsrin2
    @sxsrin2 Год назад

    I am trying to login with api and then pass that state to the page object and so far struggling with it. Can you make a video on that please ?

    • @ChecklyHQ
      @ChecklyHQ  Год назад

      Great call. We'll put it on the list. :)

  • @dand4485
    @dand4485 Год назад

    Great presentation.

    • @ChecklyHQ
      @ChecklyHQ  Год назад +1

      Thanks! Happy it's useful. :)

  • @imnutty7797
    @imnutty7797 11 месяцев назад

    What is font name do you use?

    • @ChecklyHQ
      @ChecklyHQ  11 месяцев назад +1

      It's FiraCode iScript and if you're looking for the same editor setup it's described on my blog: www.stefanjudis.com/blog/how-to-enable-beautiful-cursive-fonts-in-your-vs-code-theme/

  • @CostaGiannakopoulos
    @CostaGiannakopoulos 2 года назад

    Great video, Is it possible to create a base fixture that is common across all your tests but then extend the base fixture with something more specific that can target a subset of tests?

    • @ChecklyHQ
      @ChecklyHQ  2 года назад +1

      Great question, Costa. Yes, this is possible with `test.use()`. playwright.dev/docs/api/class-test#test-use

    • @CostaGiannakopoulos
      @CostaGiannakopoulos 2 года назад

      @@ChecklyHQ Thanks I found a solution where I create a baseFixture that holds everything that is common to all my tests and then I have fixtures that extend the base fixture that targets a subset of tests and its working perfectly. I did try the test.use() but in my use case it did not work

    • @ChecklyHQ
      @ChecklyHQ  2 года назад

      @@CostaGiannakopoulos That's great to hear? What were the issues with test.use()?

    • @CostaGiannakopoulos
      @CostaGiannakopoulos 2 года назад +1

      @@ChecklyHQ I was getting conflicts in the api request where 1 of the 2 requests was bad as they conflicted, so iv separated the conflicts into 2 new fixtures that both extend from the base so i dont have to duplicate the common stuff

    • @ChecklyHQ
      @ChecklyHQ  2 года назад +1

      @@CostaGiannakopoulos Great. Thanks for explaining!

  • @QaAutomationAlchemist
    @QaAutomationAlchemist 11 месяцев назад

    Great video🎉

    • @ChecklyHQ
      @ChecklyHQ  11 месяцев назад

      Glad you enjoyed it. Thanks!

  • @takeshikriang
    @takeshikriang Год назад

    Very helpful, thanks.

  • @aleksandrdobrev6584
    @aleksandrdobrev6584 2 года назад

    Very nice channel with good and simple explanations!
    How does this compare to a Page Object method? Is it better to use one over the other or maybe in combination?

    • @stefanjudis
      @stefanjudis 2 года назад

      Thanks Aleksandar. I don't think it's an either-or decision. Fixtures play nicely with POMs. I see their main advantage in being to use "native PW functionality" and the ability to have setups / teardowns next to the code running in your tests. So if you're POMs have some sort of required clean-up steps, i'd def go for a fixture setup. Hope this helps!

    • @HelloWorld-xg6nw
      @HelloWorld-xg6nw Год назад +2

      @@stefanjudis I am using fixtures to create POM objects, e.g. myAccountPage: async ({ page }, use) => {
      await use(new MyAccountPage(page));
      },
      so that I don't repear this useless code every time in test script

  • @oyerindedaniel7977
    @oyerindedaniel7977 9 месяцев назад

    nice video