首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >志愿者注册网站Selenium测试

志愿者注册网站Selenium测试
EN

Code Review用户
提问于 2022-06-15 05:06:50
回答 1查看 54关注 0票数 1

我有一个志愿者注册网站,我用Selenium编写了一些端到端的测试。Selenium当然是一个软件,可以让你在浏览器周围自动点击,这使得它很适合测试网站。

这是我第一次使用Selenium。我有一些测试是有效的,它们非常有用。但这段代码看上去又冗长又混乱。我想,当我添加测试时,这将失去控制,变得过于冗长。寻找改进的想法。

说明/问题:

  • 我是否应该安装某种库/框架来消除一些低级别的代码?
  • 对于每个测试,我使用“登录、设置设置、注销、运行测试、登录、验证测试”的模式,允许每个测试独立运行。这是最好的办法吗?
  • 我很惊讶Selenium没有内置的隐含等待。iMacros (我使用过的另一个E2E测试软件)有.它不会开始点击周围,直到页面完全加载。在Selenium中,如果您执行driver.get(),然后立即尝试执行某些操作,则会得到一个错误。我解决了这个问题,我把一个driver.wait()放在一个函数中,我总是在其他函数之前调用这个函数。
  • 我很惊讶Selenium没有自动检测HTTP错误(例如401、403、404)和PHP错误。iMacros做了这件事,这真的很好。我试图在visitPage()函数中编写一些代码来实现这一点。在理想的情况下,我们也会在JavaScript错误上失败,并进行HTML验证。
  • 我决定创建一个cookie来关闭发送电子邮件确认的网站。除此之外,一切都是正常的代码路径,所以测试应该非常彻底。

我最终将把它抛到一个Docker容器中,而不是使用driver.get(),并且我最终将在GitHub操作CI中设置这一点,但现在必须这样做。

总之,这是密码:

代码语言:javascript
复制
// global
var testString1;
var testString2;
var delay = 5000; // ms for implicit waits
var driver;
var devOrWWW = 'dev';

var secrets = [];
secrets['httpwd'] = '';
secrets['consoleUsername'] = '';
secrets['consolePassword'] = '';
secrets['deleteCompanySecurityKey'] = '';

async function visitPage(driver, uri) {
    // if URL, convert to URI
    uri = uri.replace('https://dev.titanvolunteers.com/', '');

    // Log into development version of the website. Note that these files need to be up-to-date. Don't forget to upload your changes via FTP.
    if ( devOrWWW === 'dev' ) {
        await driver.get(`https://dev:${secrets['httpwd']}@dev.titanvolunteers.com/` + uri);
    } else {
        await driver.get("https://www.titanvolunteers.com/" + uri);
    }

    // The below line serves two purposes: 1) fail on any PHP error, and 2) make sure the page is loaded before trying to click stuff, making it so we don't need to use .wait() anywhere else
    assert(await hasPageText(driver, "A PHP Error was encountered") === false, 'PHP error');

    // stuff from ci_dev/application/views/errors/html
    assert(await hasPageText(driver, "404 Page Not Found") === false, '404 error');
    assert(await hasPageText(driver, "403 Permission Error") === false, '403 error');
    assert(await hasPageText(driver, "An uncaught Exception was encountered") === false, 'PHP uncaught exception');
    assert(await hasPageText(driver, "A Database Error Occurred") === false, 'Database error');

    // Turn off email sending while testing. Too spammy. There is code in PHP that reads this cookie and turns off emails.
    await driver.manage().addCookie({name: 'no-emails', value: 'true'});
}

async function logIn(driver) {
    await visitPage(driver, "general/log_in");
    await driver.findElement(By.name("username")).sendKeys(secrets['consoleUsername']) // this is a non-admin account, which is good
    await driver.findElement(By.name("password")).sendKeys(secrets['consolePassword'])
    await driver.findElement(By.css(".sign_up_button")).click()
}

async function logOut(driver) {
    await visitPage(driver, "general/log_out");
}

async function click(driver, css) {
    await driver.findElement(By.css(css)).click();
}

async function typeIntoForm(driver, htmlName, str) {
    await driver.findElement(By.name(htmlName)).clear();
    await driver.findElement(By.name(htmlName)).sendKeys(str);
}

async function hasPageText(driver, str) {
    let bodyHTML = await driver.wait(until.elementLocated(By.css('body')), delay).getText();
    return bodyHTML.includes(str); // can't chain .includes() for some reason. can't do By.css('html') for some reason.
}

async function tickCheckBox(driver, htmlName) {
    let el = await driver.findElement(By.name(htmlName));
    if ( ! await el.isSelected() ) {
        await el.click();
    }
}

async function untickCheckBox(driver, htmlName) {
    let el = await driver.findElement(By.name(htmlName));
    if ( await el.isSelected() ) {
        await el.click();
    }
}

/** If you try to use driver.findElement() instead of driver.findElements(), it throws an exception. If you try to do assert(! driver.findElements()), it won't work because [] is not falsy in JavaScript. */
async function elementDoesNotExist(driver, by) {
    return await driver.findElements(by) === [];
}

async function elementExists(driver, by) {
    return await driver.findElements(by) !== [];
}

async function setUpEventWithDefaultPreferences(driver) {
    await logIn(driver);
    await visitPage(driver, "managers/edit_event/480-Selenium-Tests");

    // Recommend turning on
    await tickCheckBox(driver, 'race_send_vol_list_to_group_leaders');
    await tickCheckBox(driver, 'race_limit_group_member_shifts');
    await tickCheckBox(driver, 'race_reserve_group_spots');
    await tickCheckBox(driver, 'race_groups_one_shift_per_day');
    await tickCheckBox(driver, 'race_north_american_phone_number_validation');

    // Recommend turning off
    await tickCheckBox(driver, 'race_hide_from_public_event_list'); // turn this one on, rest off
    await untickCheckBox(driver, 'race_use_hard_close');
    await untickCheckBox(driver, 'race_email_vc_when_group_signs_up');
    await untickCheckBox(driver, 'race_reminder_emails_hide_estimate');
    await untickCheckBox(driver, 'race_hide_need_to_open_warning');

    // Waiver - blanking this will turn off the signature and e-signature fields, so this is basically a "show signature" setting
    await driver.findElement(By.name('race_waiver')).clear();
    await driver.findElement(By.name('race_waiver')).sendKeys("Putting text here to activate the signature and parent signature fields.");

    // submit
    await driver.findElement(By.css(`[value="Save Changes"]`)).click();

    // navigate back to the edit event page, check that all the settings are correct
    await visitPage(driver, "managers/edit_event/480-Selenium-Tests");
    assert(await driver.findElement(By.name('race_send_vol_list_to_group_leaders')).isSelected(), 'Edit Event: unexpected setting 1');
    assert(await driver.findElement(By.name('race_limit_group_member_shifts')).isSelected(), 'Edit Event: unexpected setting 2');
    assert(await driver.findElement(By.name('race_reserve_group_spots')).isSelected(), 'Edit Event: unexpected setting 3');
    assert(await driver.findElement(By.name('race_groups_one_shift_per_day')).isSelected(), 'Edit Event: unexpected setting 4');
    assert(await driver.findElement(By.name('race_north_american_phone_number_validation')).isSelected(), 'Edit Event: unexpected setting 5');
    assert(await driver.findElement(By.name('race_hide_from_public_event_list')).isSelected(), 'Edit Event: unexpected setting 6');
    assert(! await driver.findElement(By.name('race_use_hard_close')).isSelected(), 'Edit Event: unexpected setting 7');
    assert(! await driver.findElement(By.name('race_email_vc_when_group_signs_up')).isSelected(), 'Edit Event: unexpected setting 8');
    assert(! await driver.findElement(By.name('race_reminder_emails_hide_estimate')).isSelected(), 'Edit Event: unexpected setting 9');
    assert(! await driver.findElement(By.name('race_hide_need_to_open_warning')).isSelected(), 'Edit Event: unexpected setting 10');
    assert(await driver.findElement(By.name('race_waiver')).getText() === 'Putting text here to activate the signature and parent signature fields.', 'Edit Event: unexpected setting 11');

    // log out
    await logOut(driver);
}

async function deleteCurrentCompany(driver) {
    await visitPage(driver, "https://dev.titanvolunteers.com/managers/delete_current_company/");
    await driver.findElement(By.name("security_key")).sendKeys(secrets['deleteCompanySecurityKey']);
    await driver.findElement(By.css(`[type="submit"]`)).click();
}

const { Builder, By, Key, until, logging } = require('selenium-webdriver');
const assert = require('assert');
const { doesNotMatch } = require('assert');

describe('https://dev.titanvolunteers.com/', function() {
    this.timeout(500000); // essential to raise this, since default is to cut off your tests after 2 seconds. this does not like to be inside of other functions. current longest test is 120 seconds.

    before(async function() {
        testString1 = Math.random().toString() + '-Iñtërnâtiônàlizætiøn';
        testString2 = Math.random().toString() + '-Iñtërnâtiônàlizætiøn';
        driver = await new Builder().forBrowser('chrome').build();
        await driver.manage().window().maximize(); // helpful with auto screenshots
        //await driver.manage().window().setRect({ width: 1552, height: 840 })
        // await driver.manage().setTimeouts({implicit: 2000}); // not working
    });

    beforeEach(async function() {
        await driver.manage().deleteAllCookies(); // delete all cookies before each test. selenium uses a fresh browser, so cookie deletions won't affect your main browser
    });

    afterEach(async function() {
        // reuse same browser for now, faster
    });

    after(async function() {
        await driver.quit(); // closes the browser
    });

    describe('volunteers/sign_up_individual', function() {
        it('should process a signup', async function() {
            await setUpEventWithDefaultPreferences(driver);

            await visitPage(driver, "volunteers/sign_up_individual/480-Selenium-Public-Page-Tests");
            await driver.findElement(By.name("shift_id[4068]")).click();
            await driver.findElement(By.name("volunteer_email")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_email2")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_firstname")).sendKeys(testString1)
            await driver.findElement(By.name("volunteer_lastname")).sendKeys("Jones")
            await driver.findElement(By.name("volunteer_phone")).sendKeys("555-555-5555")
            const dropdown = await driver.findElement(By.name("volunteer_shirt_size"))
            await dropdown.findElement(By.xpath("//option[. = 'Small']")).click()
            await driver.findElement(By.name("spam_check")).sendKeys("30")
            await driver.findElement(By.name("volunteer_group_name")).sendKeys("Test Key Club")
            await driver.findElement(By.name("volunteer_group_leader")).click()
            await driver.findElement(By.name('volunteer_esig')).sendKeys("Signature goes here");
            await driver.findElement(By.css(".sign_up_button")).click()

            // log in and check volunteer list, verify the signup went through
            await logIn(driver);
            await visitPage(driver, "managers/volunteers_by_signup_date/480-Selenium-Public-Page-Tests?page=1");
            await driver.findElement(By.linkText(testString1)).click();

            // delete the volunteer
            await driver.findElement(By.css(`[name="additional_action"][value="delete"]`)).click();
            await driver.findElement(By.css(`[value="Save Changes"]`)).click();

            // confirm volunteer deleted
            await visitPage(driver, "managers/volunteers_by_signup_date/480-Selenium-Public-Page-Tests?page=1");
            assert(elementDoesNotExist(driver, By.linkText(testString1)));
        });

        // good to have a test that tests for failure, in addition to the test for success test above
        it('should display form validation error if spam check text box is not 30', async function() {
            await setUpEventWithDefaultPreferences(driver);

            await visitPage(driver, "volunteers/sign_up_individual/480-Selenium-Public-Page-Tests");
            await driver.findElement(By.name("shift_id[4068]")).click();
            await driver.findElement(By.name("volunteer_email")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_email2")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_firstname")).sendKeys(testString1)
            await driver.findElement(By.name("volunteer_lastname")).sendKeys("Jones")
            await driver.findElement(By.name("volunteer_phone")).sendKeys("555-555-5555");
            const dropdown = await driver.findElement(By.name("volunteer_shirt_size"))
            await dropdown.findElement(By.xpath("//option[. = 'Small']")).click()
            await driver.findElement(By.name("spam_check")).sendKeys("29")
            await driver.findElement(By.name("volunteer_group_name")).sendKeys("Test Key Club")
            await driver.findElement(By.name("volunteer_group_leader")).click()
            await driver.findElement(By.name('volunteer_esig')).sendKeys("Signature goes here");
            await driver.findElement(By.css(".sign_up_button")).click()

            // make sure it throws the spam check validation error
            assert(await hasPageText(driver, "The Spam Check field must be one of: 30.") === true, 'Spam check failure message not detected');
        });

        it('should display form validation error if international phone number given with phone # validation turned ON', async function() {
            await setUpEventWithDefaultPreferences(driver);

            await visitPage(driver, "volunteers/sign_up_individual/480-Selenium-Public-Page-Tests");
            await driver.findElement(By.name("shift_id[4068]")).click();
            await driver.findElement(By.name("volunteer_email")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_email2")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_firstname")).sendKeys(testString1)
            await driver.findElement(By.name("volunteer_lastname")).sendKeys("Jones")
            await driver.findElement(By.name("volunteer_phone")).sendKeys("07825654199");
            const dropdown = await driver.findElement(By.name("volunteer_shirt_size"))
            await dropdown.findElement(By.xpath("//option[. = 'Small']")).click()
            await driver.findElement(By.name("spam_check")).sendKeys("30")
            await driver.findElement(By.name("volunteer_group_name")).sendKeys("Test Key Club")
            await driver.findElement(By.name("volunteer_group_leader")).click()
            await driver.findElement(By.name('volunteer_esig')).sendKeys("Signature goes here");
            await driver.findElement(By.css(".sign_up_button")).click()

            // make sure it throws the spam check validation error
            assert(await hasPageText(driver, "Cell Phone must be in the format 111-111-1111 x111") === true);
        });

        it('should NOT display form validation error if international phone number given with phone # validation turned OFF', async function() {
            await setUpEventWithDefaultPreferences(driver);

            await logIn(driver);
            await visitPage(driver, "managers/edit_event/480-Selenium-Tests");
            await untickCheckBox(driver, 'race_north_american_phone_number_validation');
            await driver.findElement(By.css(`[value="Save Changes"]`)).click();
            await logOut(driver);

            await visitPage(driver, "volunteers/sign_up_individual/480-Selenium-Public-Page-Tests");
            await driver.findElement(By.name("shift_id[4068]")).click();
            await driver.findElement(By.name("volunteer_email")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_email2")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_firstname")).sendKeys(testString1)
            await driver.findElement(By.name("volunteer_lastname")).sendKeys("Jones")
            await driver.findElement(By.name("volunteer_phone")).sendKeys("07825654199");
            const dropdown = await driver.findElement(By.name("volunteer_shirt_size"))
            await dropdown.findElement(By.xpath("//option[. = 'Small']")).click()
            await driver.findElement(By.name("spam_check")).sendKeys("30")
            await driver.findElement(By.name("volunteer_group_name")).sendKeys("Test Key Club")
            await driver.findElement(By.name("volunteer_group_leader")).click()
            await driver.findElement(By.name('volunteer_esig')).sendKeys("Signature goes here");
            await driver.findElement(By.css(".sign_up_button")).click()

            assert(await hasPageText(driver, "Cell Phone must be in the format 111-111-1111 x111") === false);

            await logIn(driver);
            await visitPage(driver, "managers/volunteers_by_signup_date/480-Selenium-Public-Page-Tests?page=1");
            await driver.findElement(By.linkText(testString1)).click();
            await driver.findElement(By.css(`[name="additional_action"][value="delete"]`)).click();
            await driver.findElement(By.css(`[value="Save Changes"]`)).click();
        });
    });

    describe('volunteers/sign_up_group_leader', function() {
        it('should process a signup', async function() {
            await setUpEventWithDefaultPreferences(driver);

            await visitPage(driver, "volunteers/sign_up_group_leader/480-Selenium-Public-Page-Tests");
            await driver.findElement(By.name("shift_id[4068]")).sendKeys("10");
            await driver.findElement(By.name("group_name")).sendKeys(testString1)
            await driver.findElement(By.name("volunteer_email")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_email2")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_firstname")).sendKeys(testString2)
            await driver.findElement(By.name("volunteer_lastname")).sendKeys("Jones")
            await driver.findElement(By.name("volunteer_phone")).sendKeys("555-555-5555")
            const dropdown = await driver.findElement(By.name("volunteer_shirt_size"))
            await dropdown.findElement(By.xpath("//option[. = 'Small']")).click()
            await driver.findElement(By.name("spam_check")).sendKeys("30")
            await driver.findElement(By.name('volunteer_esig')).sendKeys("Signature goes here");
            await driver.findElement(By.css(".sign_up_button")).click()

            // log in and check group list, verify the signup went through
            await logIn(driver);
            await visitPage(driver, "managers/group_report/480-Selenium-Tests");
            await driver.findElement(By.linkText(testString1)).click();

            // delete the group
            await driver.findElement(By.name("delete_group")).click();
            await driver.findElement(By.name("delete_group_members")).click();
            await driver.findElement(By.css(`[value="Edit Group"]`)).click();

            // confirm group deleted
            await visitPage(driver, "managers/group_report/480-Selenium-Tests");
            assert(elementDoesNotExist(driver, By.linkText(testString1)));

            // confirm volunteer deleted
            await visitPage(driver, "managers/volunteers_by_signup_date/480-Selenium-Public-Page-Tests?page=1");
            assert(elementDoesNotExist(driver, By.linkText(testString2)));
        });
    });

    describe('volunteers/sign_up_group_member', function() {
        it('should process a signup', async function() {
            await setUpEventWithDefaultPreferences(driver);

            // log in, add a group, log out
            await logIn(driver);
            await visitPage(driver, "managers/add_group/480-Selenium-Tests");
            await typeIntoForm(driver, 'group_name', testString1);
            await typeIntoForm(driver, 'shift_id[4068]', '10');
            await driver.findElement(By.css(`[value="Add Group"]`)).click();

            // confirm group created
            await visitPage(driver, "managers/group_report/480-Selenium-Tests");
            assert(elementExists(driver, By.linkText(testString1)), 'managers/add_group failed');

            await logOut(driver);

            // sign up group member
            await visitPage(driver, "volunteers/sign_up_individual/480-Selenium-Public-Page-Tests");
            const dropdown = await driver.findElement(By.id("group_picker"));
            await dropdown.findElement(By.xpath(`//option[contains(.,'${testString1}')]`)).click();
            await tickCheckBox(driver, 'shift_id[4068]');
            await driver.findElement(By.name("volunteer_email")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_email2")).sendKeys("test12345@gmail.com")
            await driver.findElement(By.name("volunteer_firstname")).sendKeys(testString2)
            await driver.findElement(By.name("volunteer_lastname")).sendKeys("Jones")
            await driver.findElement(By.name("volunteer_phone")).sendKeys("555-555-5555");
            const dropdown2 = await driver.findElement(By.name("volunteer_shirt_size"))
            await dropdown2.findElement(By.xpath("//option[. = 'Small']")).click()
            await driver.findElement(By.name("spam_check")).sendKeys("30")
            await driver.findElement(By.name('volunteer_esig')).sendKeys("Signature goes here");
            await driver.findElement(By.css(".sign_up_button")).click()

            // verify volunteer
            await logIn(driver);
            await visitPage(driver, "managers/volunteers_by_signup_date/480-Selenium-Public-Page-Tests?page=1");
            await driver.findElement(By.linkText(testString2)).click();

            // verify group
            await visitPage(driver, "managers/group_report/480-Selenium-Tests");
            await driver.findElement(By.linkText(testString1)).click();

            // delete group
            await driver.findElement(By.name("delete_group")).click();
            await driver.findElement(By.name("delete_group_members")).click();
            await driver.findElement(By.css(`[value="Edit Group"]`)).click();

            // confirm group deleted
            await visitPage(driver, "managers/group_report/480-Selenium-Tests");
            assert(elementDoesNotExist(driver, By.linkText(testString1)));

            // confirm volunteer deleted (deleted during group delete process)
            await visitPage(driver, "managers/volunteers_by_signup_date/480-Selenium-Public-Page-Tests?page=1");
            assert(elementDoesNotExist(driver, By.linkText(testString2)));
        });
    });

    describe('entire website', function() {
        it('should visit every page via HTTP GET (not POST), and not find any PHP or 404 errors', async function() {
            // logged out
            await visitPage(driver, "/");
            await visitPage(driver, "https://dev.titanvolunteers.com/volunteers/view_event_list");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/screenshots");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/sign_up_company");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/tips");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/log_in");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/about_us");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/contact_us");
            await visitPage(driver, "https://dev.titanvolunteers.com/volunteers/sign_up_individual/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/volunteers/sign_up_group_leader/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/password_reset_begin");
            await visitPage(driver, "https://dev.titanvolunteers.com/volunteers/verification_letter/480-Selenium-Tests?code=9a54e609");
            await visitPage(driver, "https://dev.titanvolunteers.com/general/paypal_listener");

            // logged in
            await logIn(driver);

            // company menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/company_report/5-Test-Company");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/add_event/5-Test-Company");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/buy_more");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/master_volunteer_list/5-Test-Company");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_search_company/5-Test-Company");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/blacklist/5-Test-Company");
            await visitPage(driver, "https://dev.titanvolunteers.com/volunteers/shift_info/4068-1-Test-Shift-000?code=0849ef0f");

            // shifts menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_report/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_report/480-Selenium-Tests?printer_friendly=1¬es=0");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_report/480-Selenium-Tests?excel=1");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_report_simple/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_report_simple/480-Selenium-Tests?printer_friendly=1");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/add_shifts/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/edit_shifts/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/merge_shifts/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/shift_info_links/480-Selenium-Tests");

            // group menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/group_report/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/group_report/480-Selenium-Tests?printer_friendly=1");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/add_group/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/email_group_reminders/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/text_group_reminders/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/mass_edit_volunteers_by_group_name/480-Selenium-Tests");

            // event menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/edit_event/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/delete_event/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/duplicate_event/480-Selenium-Tests");

            // volunteer menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteers_by_signup_date/480-Selenium-Tests?page=1");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/volunteer_search/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/add_volunteer/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/export_to_excel/480-Selenium-Tests");

            // email menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/email_group_reminders/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/email_vol_instructions/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/email_list/480-Selenium-Tests");

            // printouts menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/sign_in_sheets/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/sign_in_sheets_print/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/single_page_waiver/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/single_page_waiver_print/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/alpha_list_tool_gbs_configure/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/alpha_list_tool_gbs_view/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/alpha_list_tool_gbg_configure/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/alpha_list_tool_gbg_view/480-Selenium-Tests");
            
            // misc menu
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/post_race_report/480-Selenium-Tests");
                await visitPage(driver, "https://dev.titanvolunteers.com/managers/post_race_report/480-Selenium-Tests?printer_friendly=1");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/edit_post_race_data/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/shift_list_as_text/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/shift_list_as_table/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/verification_letter/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/edit_templates/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/signup_sources/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/signup_graph/480-Selenium-Tests");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/invoice_generator/480-Selenium-Tests");

            await visitPage(driver, "https://dev.titanvolunteers.com/managers/paypal_successful");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/paypal_unsuccessful");
            await visitPage(driver, "https://dev.titanvolunteers.com/managers/paypal");

            await logOut(driver);
        });
    });

    describe('general/sign_up_company', function() {
        it('should process a signup', async function() {
            await visitPage(driver, "https://dev.titanvolunteers.com/general/sign_up_company");
            await driver.findElement(By.name("manager_email")).sendKeys("test@gmail.com")
            await driver.findElement(By.name("manager_password")).sendKeys("ToughPassword#1");
            await driver.findElement(By.name("manager_firstname")).sendKeys("Selenium");
            await driver.findElement(By.name("manager_lastname")).sendKeys("Tests");
            await driver.findElement(By.name("manager_phone")).sendKeys("555-555-5555");
            await driver.findElement(By.name("company_website_url")).sendKeys("www.test.com");
            await driver.findElement(By.name("i_understand_1")).click();
            await driver.findElement(By.name("i_understand_2")).click();
            await driver.findElement(By.css(`[value="Create Your Account"]`)).click();

            // Account creation successful page
            await driver.findElement(By.linkText('Click here')).click();

            // Shift report
            await driver.findElement(By.linkText('Control Panel (Selenium Tests)')).click();

            // Company report

            await deleteCurrentCompany(driver);
        });

        it('should allow international phone numbers', async function() {
            await visitPage(driver, "https://dev.titanvolunteers.com/general/sign_up_company");
            await driver.findElement(By.name("manager_email")).sendKeys("test@gmail.com")
            await driver.findElement(By.name("manager_password")).sendKeys("ToughPassword#1");
            await driver.findElement(By.name("manager_firstname")).sendKeys("Selenium");
            await driver.findElement(By.name("manager_lastname")).sendKeys("Tests");
            await driver.findElement(By.name("manager_phone")).sendKeys("07825654199");
            await driver.findElement(By.name("company_website_url")).sendKeys("www.test.com");
            await driver.findElement(By.name("i_understand_1")).click();
            await driver.findElement(By.name("i_understand_2")).click();
            await driver.findElement(By.css(`[value="Create Your Account"]`)).click();

            // Account creation successful page
            await driver.findElement(By.linkText('Click here')).click();

            // Shift report
            await driver.findElement(By.linkText('Control Panel (Selenium Tests)')).click();

            // Company report

            await deleteCurrentCompany(driver);
        });
    });
});

耽误您时间,实在对不起。

EN

回答 1

Code Review用户

发布于 2022-06-15 20:29:26

这是一个粗略的解释,但我认为您可以从Selenium的冗长的包装中获益。

我在这里借用了经常被称为“屏幕播放”的设计模式,它是由宁静/JS推广的,您可以在这里更深入地了解设计模式。您是否想要全神贯注地采用一个框架,这可能取决于测试任务的规模。我想我已经在下面概述了它实际上是一个非常简单的模式,但我想问题就在细节上。

在本质上,Actor表示正在“执行”工作的实体,注入了它所需的工具(S)(在本例中是Selenium驱动程序实例)。剧本将这些封装在“能力”中,但为了简单起见,我只是直接传递driver

然后,我们用简单的函数包装我们的By.name|css调用,这样我们就不会那么依赖于避免输入字符串,并抽象出特定的定位器策略对于给定的DOM元素是什么(如果以后重构的话有用)。

每个'action‘也由一个高阶函数表示,每个函数作为一个单独的参数传递给一个函数,该函数将它们映射为承诺,并将整个数组封装在一个承诺中。

希望您也可以将此应用于验证,Screenplay模式使用“问题”的概念封装请求(例如DOM元素的内容),然后将其与对结果执行某些验证的“期望”配对。

这里的目的是从“如何”执行中抽象出要完成的工作,这样测试用例就很容易推理了。

另一种选择是,它创建了一个助手类“每个”目标页面,但我总是发现,锅炉板要多得多,而且不能重用。如果您的代码库具有良好的命名约定,您应该能够看到,例如,定位器、操作和问题可以跨多个页面重用。

代码语言:javascript
复制
class Actor {
    constructor(driver) {
        this.driver = driver
    }

    async attemptsTo(...actions) {
        return Promise.all(actions.map(action => action(this.driver)))
    }
}

function visit(url) {
    return (driver) => visitPage(driver, "https://dev.titanvolunteers.com/general/sign_up_company")
}

const managerEmail = () => By.name("manager_email")
const managerPassword = () => By.name("manager_password")
const managerFirstname = () => By.name("manager_firstname")
const managerLastname = () => By.name("manager_lastname")
const managerPhone = () => By.name("manager_phone")
const companyWebsiteUrl = () => By.name("company_website_url")
const iUnderstand1 = () => By.name("i_understand_1")
const iUnderstand2 = () => By.name("i_understand_2")
const createYourAccount = () => By.css(`[value="Create Your Account"]`)

const sendKeys = (locator, keys) => (driver) => driver.findElement(locator).sendKeys(keys)
const click = (locator) => (driver) => driver.findElement(locator).click()

(async () => {

    // Imagine this is the body of a test

    const driver = {}   // whatever setup this needs

    const actor = new Actor(driver)

    // Depending on your test framework you might want to return the 
    // Promise, await on it, perform some assertions etc, as you see fit.

    await actor.attemptsTo(
        visit("https://dev.titanvolunteers.com/general/sign_up_company"),
        sendKeys(managerEmail(), "test@gmail.com"),
        sendKeys(managerPassword(), "ToughPassword#1"),
        sendKeys(managerFirstname(), "Selenium"),
        sendKeys(managerLastname(), "Tests"),
        sendKeys(managerPhone(), "07825654199"),
        sendKeys(companyWebsiteUrl(),"www.test.com"),
        click(iUnderstand1()),
        click(iUnderstand2()),
        click(createYourAccount()),
    )
})()
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/277355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档