我有一个志愿者注册网站,我用Selenium编写了一些端到端的测试。Selenium当然是一个软件,可以让你在浏览器周围自动点击,这使得它很适合测试网站。
这是我第一次使用Selenium。我有一些测试是有效的,它们非常有用。但这段代码看上去又冗长又混乱。我想,当我添加测试时,这将失去控制,变得过于冗长。寻找改进的想法。
说明/问题:
driver.get(),然后立即尝试执行某些操作,则会得到一个错误。我解决了这个问题,我把一个driver.wait()放在一个函数中,我总是在其他函数之前调用这个函数。visitPage()函数中编写一些代码来实现这一点。在理想的情况下,我们也会在JavaScript错误上失败,并进行HTML验证。我最终将把它抛到一个Docker容器中,而不是使用driver.get(),并且我最终将在GitHub操作CI中设置这一点,但现在必须这样做。
总之,这是密码:

// 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);
});
});
});耽误您时间,实在对不起。
发布于 2022-06-15 20:29:26
这是一个粗略的解释,但我认为您可以从Selenium的冗长的包装中获益。
我在这里借用了经常被称为“屏幕播放”的设计模式,它是由宁静/JS推广的,您可以在这里更深入地了解设计模式。您是否想要全神贯注地采用一个框架,这可能取决于测试任务的规模。我想我已经在下面概述了它实际上是一个非常简单的模式,但我想问题就在细节上。
在本质上,Actor表示正在“执行”工作的实体,注入了它所需的工具(S)(在本例中是Selenium驱动程序实例)。剧本将这些封装在“能力”中,但为了简单起见,我只是直接传递driver。
然后,我们用简单的函数包装我们的By.name|css调用,这样我们就不会那么依赖于避免输入字符串,并抽象出特定的定位器策略对于给定的DOM元素是什么(如果以后重构的话有用)。
每个'action‘也由一个高阶函数表示,每个函数作为一个单独的参数传递给一个函数,该函数将它们映射为承诺,并将整个数组封装在一个承诺中。
希望您也可以将此应用于验证,Screenplay模式使用“问题”的概念封装请求(例如DOM元素的内容),然后将其与对结果执行某些验证的“期望”配对。
这里的目的是从“如何”执行中抽象出要完成的工作,这样测试用例就很容易推理了。
另一种选择是,它创建了一个助手类“每个”目标页面,但我总是发现,锅炉板要多得多,而且不能重用。如果您的代码库具有良好的命名约定,您应该能够看到,例如,定位器、操作和问题可以跨多个页面重用。
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()),
)
})()https://codereview.stackexchange.com/questions/277355
复制相似问题