Browser detection using user agent in fixture hooks









up vote
1
down vote

favorite












I have a few tests that only need to be run when in a mobile browser. Currently I have a client function to check the user agent.



const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))


Which I then access inside my tests:



test("Check if mobile", async t => 
const isMobile = await checkMobile();
if (isMobile)
await t
// do the tests




Is there a way for me to use this in a fixture? Like a fixture which will only run if checkMobile is true? So I don't need to repeat this check in every test manually. I'm sure there's a smarter way to go about it than what I have right now. I tried doing the check in the fixture's beforeEach hook but it didn't work out for me to then try to share the outcome of that in a variable to pass down to the tests.










share|improve this question

























    up vote
    1
    down vote

    favorite












    I have a few tests that only need to be run when in a mobile browser. Currently I have a client function to check the user agent.



    const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))


    Which I then access inside my tests:



    test("Check if mobile", async t => 
    const isMobile = await checkMobile();
    if (isMobile)
    await t
    // do the tests




    Is there a way for me to use this in a fixture? Like a fixture which will only run if checkMobile is true? So I don't need to repeat this check in every test manually. I'm sure there's a smarter way to go about it than what I have right now. I tried doing the check in the fixture's beforeEach hook but it didn't work out for me to then try to share the outcome of that in a variable to pass down to the tests.










    share|improve this question























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I have a few tests that only need to be run when in a mobile browser. Currently I have a client function to check the user agent.



      const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))


      Which I then access inside my tests:



      test("Check if mobile", async t => 
      const isMobile = await checkMobile();
      if (isMobile)
      await t
      // do the tests




      Is there a way for me to use this in a fixture? Like a fixture which will only run if checkMobile is true? So I don't need to repeat this check in every test manually. I'm sure there's a smarter way to go about it than what I have right now. I tried doing the check in the fixture's beforeEach hook but it didn't work out for me to then try to share the outcome of that in a variable to pass down to the tests.










      share|improve this question













      I have a few tests that only need to be run when in a mobile browser. Currently I have a client function to check the user agent.



      const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))


      Which I then access inside my tests:



      test("Check if mobile", async t => 
      const isMobile = await checkMobile();
      if (isMobile)
      await t
      // do the tests




      Is there a way for me to use this in a fixture? Like a fixture which will only run if checkMobile is true? So I don't need to repeat this check in every test manually. I'm sure there's a smarter way to go about it than what I have right now. I tried doing the check in the fixture's beforeEach hook but it didn't work out for me to then try to share the outcome of that in a variable to pass down to the tests.







      automated-tests e2e-testing testcafe






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 9 at 2:50









      sammiepls

      627




      627






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          To share a variable from the fixture hook for testing, you can use fixture context http://devexpress.github.io/testcafe/documentation/test-api/test-code-structure.html#sharing-variables-between-fixture-hooks-and-test-code



          In addition, you can reorganize your test in the following manner:



          import ClientFunction from 'testcafe';


          fixture `test`.page('http://example.com').beforeEach(async t =>
          const isMobile = await checkMobile();

          t.ctx.isMobile = isMobile;
          )

          const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))

          function testAndCheck (testName, testFn)
          const foo = async t =>
          if (t.ctx.isMobile)
          await testFn(t)
          else
          throw new Error('not mobile');


          test(testName, foo);


          testAndCheck('test1', async t =>
          await t.click('h1');
          await t.click('div');
          await t.click('h1');
          )


          Here I define the testAndCheck function that extends the test function with an additional check for mobile devices.



          In addition, you can refer to this comment https://github.com/DevExpress/testcafe/issues/1626#issuecomment-417424558 to see which other ways exist to overcome the issue.






          share|improve this answer




















          • Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
            – sammiepls
            Nov 15 at 3:11






          • 1




            It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
            – Alex Kamaev
            Nov 15 at 7:58










          • Is it possible to skip tests within the before hooks of the fixture?
            – sammiepls
            Nov 21 at 3:12






          • 1




            @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
            – Alex Kamaev
            Nov 21 at 9:31










          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53219157%2fbrowser-detection-using-user-agent-in-fixture-hooks%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          2
          down vote



          accepted










          To share a variable from the fixture hook for testing, you can use fixture context http://devexpress.github.io/testcafe/documentation/test-api/test-code-structure.html#sharing-variables-between-fixture-hooks-and-test-code



          In addition, you can reorganize your test in the following manner:



          import ClientFunction from 'testcafe';


          fixture `test`.page('http://example.com').beforeEach(async t =>
          const isMobile = await checkMobile();

          t.ctx.isMobile = isMobile;
          )

          const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))

          function testAndCheck (testName, testFn)
          const foo = async t =>
          if (t.ctx.isMobile)
          await testFn(t)
          else
          throw new Error('not mobile');


          test(testName, foo);


          testAndCheck('test1', async t =>
          await t.click('h1');
          await t.click('div');
          await t.click('h1');
          )


          Here I define the testAndCheck function that extends the test function with an additional check for mobile devices.



          In addition, you can refer to this comment https://github.com/DevExpress/testcafe/issues/1626#issuecomment-417424558 to see which other ways exist to overcome the issue.






          share|improve this answer




















          • Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
            – sammiepls
            Nov 15 at 3:11






          • 1




            It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
            – Alex Kamaev
            Nov 15 at 7:58










          • Is it possible to skip tests within the before hooks of the fixture?
            – sammiepls
            Nov 21 at 3:12






          • 1




            @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
            – Alex Kamaev
            Nov 21 at 9:31














          up vote
          2
          down vote



          accepted










          To share a variable from the fixture hook for testing, you can use fixture context http://devexpress.github.io/testcafe/documentation/test-api/test-code-structure.html#sharing-variables-between-fixture-hooks-and-test-code



          In addition, you can reorganize your test in the following manner:



          import ClientFunction from 'testcafe';


          fixture `test`.page('http://example.com').beforeEach(async t =>
          const isMobile = await checkMobile();

          t.ctx.isMobile = isMobile;
          )

          const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))

          function testAndCheck (testName, testFn)
          const foo = async t =>
          if (t.ctx.isMobile)
          await testFn(t)
          else
          throw new Error('not mobile');


          test(testName, foo);


          testAndCheck('test1', async t =>
          await t.click('h1');
          await t.click('div');
          await t.click('h1');
          )


          Here I define the testAndCheck function that extends the test function with an additional check for mobile devices.



          In addition, you can refer to this comment https://github.com/DevExpress/testcafe/issues/1626#issuecomment-417424558 to see which other ways exist to overcome the issue.






          share|improve this answer




















          • Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
            – sammiepls
            Nov 15 at 3:11






          • 1




            It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
            – Alex Kamaev
            Nov 15 at 7:58










          • Is it possible to skip tests within the before hooks of the fixture?
            – sammiepls
            Nov 21 at 3:12






          • 1




            @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
            – Alex Kamaev
            Nov 21 at 9:31












          up vote
          2
          down vote



          accepted







          up vote
          2
          down vote



          accepted






          To share a variable from the fixture hook for testing, you can use fixture context http://devexpress.github.io/testcafe/documentation/test-api/test-code-structure.html#sharing-variables-between-fixture-hooks-and-test-code



          In addition, you can reorganize your test in the following manner:



          import ClientFunction from 'testcafe';


          fixture `test`.page('http://example.com').beforeEach(async t =>
          const isMobile = await checkMobile();

          t.ctx.isMobile = isMobile;
          )

          const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))

          function testAndCheck (testName, testFn)
          const foo = async t =>
          if (t.ctx.isMobile)
          await testFn(t)
          else
          throw new Error('not mobile');


          test(testName, foo);


          testAndCheck('test1', async t =>
          await t.click('h1');
          await t.click('div');
          await t.click('h1');
          )


          Here I define the testAndCheck function that extends the test function with an additional check for mobile devices.



          In addition, you can refer to this comment https://github.com/DevExpress/testcafe/issues/1626#issuecomment-417424558 to see which other ways exist to overcome the issue.






          share|improve this answer












          To share a variable from the fixture hook for testing, you can use fixture context http://devexpress.github.io/testcafe/documentation/test-api/test-code-structure.html#sharing-variables-between-fixture-hooks-and-test-code



          In addition, you can reorganize your test in the following manner:



          import ClientFunction from 'testcafe';


          fixture `test`.page('http://example.com').beforeEach(async t =>
          const isMobile = await checkMobile();

          t.ctx.isMobile = isMobile;
          )

          const checkMobile = ClientFunction(() => /iPhone|Android/i.test(navigator.userAgent))

          function testAndCheck (testName, testFn)
          const foo = async t =>
          if (t.ctx.isMobile)
          await testFn(t)
          else
          throw new Error('not mobile');


          test(testName, foo);


          testAndCheck('test1', async t =>
          await t.click('h1');
          await t.click('div');
          await t.click('h1');
          )


          Here I define the testAndCheck function that extends the test function with an additional check for mobile devices.



          In addition, you can refer to this comment https://github.com/DevExpress/testcafe/issues/1626#issuecomment-417424558 to see which other ways exist to overcome the issue.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 12 at 9:39









          Alex Kamaev

          4717




          4717











          • Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
            – sammiepls
            Nov 15 at 3:11






          • 1




            It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
            – Alex Kamaev
            Nov 15 at 7:58










          • Is it possible to skip tests within the before hooks of the fixture?
            – sammiepls
            Nov 21 at 3:12






          • 1




            @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
            – Alex Kamaev
            Nov 21 at 9:31
















          • Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
            – sammiepls
            Nov 15 at 3:11






          • 1




            It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
            – Alex Kamaev
            Nov 15 at 7:58










          • Is it possible to skip tests within the before hooks of the fixture?
            – sammiepls
            Nov 21 at 3:12






          • 1




            @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
            – Alex Kamaev
            Nov 21 at 9:31















          Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
          – sammiepls
          Nov 15 at 3:11




          Thanks so much Alex! Before I approve your answer I'd like to clarify if it's possible to check if it's mobile first before running the entire fixture? I don't really want to throw an error, just want to skip the whole fixture (which I'm putting all my mobile tests in, so would make sense on desktop to skip it completely)
          – sammiepls
          Nov 15 at 3:11




          1




          1




          It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
          – Alex Kamaev
          Nov 15 at 7:58




          It's not required to throw an error. You can just avoid using the else branch. If suggested solutions don't suit your needs, you can reorganize your test approach. For example, run the testcafe command twice for desktop and mobile devices: testcafe chrome,firefox desktop-tests.js testcafe remote mobile.js Or, you can use the new testcafe filtering feature devexpress.github.io/testcafe/documentation/using-testcafe/… testcafe chrome my-tests --fixture-meta device=mobile,env=production
          – Alex Kamaev
          Nov 15 at 7:58












          Is it possible to skip tests within the before hooks of the fixture?
          – sammiepls
          Nov 21 at 3:12




          Is it possible to skip tests within the before hooks of the fixture?
          – sammiepls
          Nov 21 at 3:12




          1




          1




          @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
          – Alex Kamaev
          Nov 21 at 9:31




          @sammiepls, For now, you can achieve the desired behavior only by using the workaround which I suggested in my answer. You can replace the isMobile condition with yours. However, I think that it would be nice to have this feature, so probably we'll implement it in the future.
          – Alex Kamaev
          Nov 21 at 9:31

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53219157%2fbrowser-detection-using-user-agent-in-fixture-hooks%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

          Edmonton

          Crossroads (UK TV series)