javascript - Assert presence of text in an html tag attribute using Puppeteer, Mocha and Chai - Stack Overflow

I'm beginning my journey with these technologies (including Javascript), so, a beginners question.

I'm beginning my journey with these technologies (including Javascript), so, a beginners question. I'm struggling to work out how to assert that the given text within an HTML attribute is as expected.

The HTML snippet:

<input name="8hv3a" type="radio" id="email-optout-8hv3a" value="1|optin|out" data-.user-edited="yes">

Here is my .it function thus far, using Mochai, Puppeteer and Chai (setup and teardown elided for clarity:

  it('opt out of email', async function () {

        await page.setDefaultNavigationTimeout();
        await page.waitForSelector('.widget-title');
        const frame = page.frames().find(frame => frame.name() === 'iframe');
        const emailOptOutButton = await frame.$('#email-optout-8hv3a');
        await emailOptOutButton.click();
        const emailOptOutConfirmedValue = await frame.$('#email-optout-8hv3a', e => e.getAttribute('data-.user-edited'))
        expect(emailOptOutConfirmedValue).to.include('yes')


    })

I'm beginning my journey with these technologies (including Javascript), so, a beginners question. I'm struggling to work out how to assert that the given text within an HTML attribute is as expected.

The HTML snippet:

<input name="8hv3a" type="radio" id="email-optout-8hv3a" value="1|optin|out" data-.user-edited="yes">

Here is my .it function thus far, using Mochai, Puppeteer and Chai (setup and teardown elided for clarity:

  it('opt out of email', async function () {

        await page.setDefaultNavigationTimeout();
        await page.waitForSelector('.widget-title');
        const frame = page.frames().find(frame => frame.name() === 'iframe');
        const emailOptOutButton = await frame.$('#email-optout-8hv3a');
        await emailOptOutButton.click();
        const emailOptOutConfirmedValue = await frame.$('#email-optout-8hv3a', e => e.getAttribute('data-.user-edited'))
        expect(emailOptOutConfirmedValue).to.include('yes')


    })

Everything works up until the click event, but my assertion is clearly wrong. The error is:

 AssertionError: object tested must be an array, a map, an object, a set, a string, or a weakset, but object given

I've tried

    it('opt out of email', async function () {

    await page.setDefaultNavigationTimeout();
    await page.waitForSelector('.widget-title');
    const frame = page.frames().find(frame => frame.name() === 'iframe');
    const emailOptOutButton = await frame.$('#email-optout-8hv3a');
    await emailOptOutButton.click();
    await page.$eval.emailOptOutConfirmedValue.getAttribute('data-.user-edited')
    expect(emailOptOutConfirmedValue).to.include('yes')


})

Which gives:

  TypeError: Cannot read property 'getAttribute' of undefined

And also:

 it('opt out of email', async function () {

    await page.setDefaultNavigationTimeout();
    await page.waitForSelector('.widget-title');
    const frame = page.frames().find(frame => frame.name() === 'iframe');
    const emailOptOutButton = await frame.$('#email-optout-8hv3a');
    await emailOptOutButton.click();
    const emailOptOutConfirmedValue = await frame.$('#email-optout-8hv3a', e => e.getAttribute('data-.user-edited'))
    assert.equal(emailOptOutConfirmedValue, 'yes')


})

Which gives:

ReferenceError: assert is not defined

As I said, I'm a beginner so go any help appreciated!

Share Improve this question asked Nov 4, 2018 at 12:50 SteerpikeSteerpike 1,86310 gold badges43 silver badges84 bronze badges 1
  • Have you checked what console.log( typeof emailOptOutConfirmedValue ) or just console.log( emailOptOutConfirmedValue ) print out? – lumio Commented Nov 6, 2018 at 16:56
Add a ment  | 

1 Answer 1

Reset to default 4 +25

This code is wrong:

const emailOptOutConfirmedValue = await frame.$('#email-optout-8hv3a', e => e.getAttribute('data-.user-edited'))
expect(emailOptOutConfirmedValue).to.include('yes')

You're using frame.$(selector). Notice how it takes only one argument. The second argument is ignored and your call returns a handle to a DOM element, which causes the expect(...).to.include(...) to fail with a plaint that it cannot test that thing.

You should use frame.$eval(selector, pageFunction[, ...args]) instead. This call will call the function passed as a second argument on the result of applying the selector. So the code should be:

const emailOptOutConfirmedValue = await frame.$eval('#email-optout-8hv3a', e => e.getAttribute('data-.user-edited'))
expect(emailOptOutConfirmedValue).to.include('yes')

I've left your test intact above, but it seems to me what you'd be looking for here is for a specific value for the attribute, so I'd use this test:

expect(emailOptOutConfirmedValue).to.equal('yes')

The inclusion test would pass if the attribute's value is baryesfoo.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745570009a4633623.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信