def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.release = ReleasePage(self.driver) self.ut = Util() self.driver = driver
def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.meeting = MeetingNotesPages(self.driver) self.driver = driver
def __init__(self, driver): super().__init__(driver) self.deall = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.request = RequestRevisionPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.driver = driver
def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.broker = BrokerPages(self.driver) self.landlord = LandlordPages(self.driver) self.ut = Util() self.driver = driver
class DealListTest(unittest.TestCase): log = cl.customLogger(logging.DEBUG) @pytest.fixture(autouse=True) def objectSetup(self, oneTimeSetUp): self.deal = DealList(self.driver) def test_01AccessMyDeal(self): self.log.info("*#" * 20) self.log.info(" Access my deal filter ") self.log.info("*#" * 20) self.deal.AccessMyDealQuickFilter() def test_02AccessNeedMyApproval(self): self.log.info("*#" * 20) self.log.info(" Access Need my approval filter ") self.log.info("*#" * 20) self.deal.AccessNeedMyApprovalFilter() def test_03AccessPendingRelease(self): self.log.info("*#" * 20) self.log.info(" Access Pending Release filter ") self.log.info("*#" * 20) self.deal.AccessPendingReleaseFilter() def test_05AddingNewDealFunctionality(self): self.log.info("*#" * 20) self.log.info(" Adding New deal functionality ") self.log.info("*#" * 20) self.deal.AddNewDeal() def test_06AddingNewDealHavingDealsAlreadyAvailable(self): self.log.info("*#" * 20) self.log.info(" Adding New deal having deals already available") self.log.info("*#" * 20) self.deal.DealAlreadyAvailableText()
class PhotoModalPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.driver = driver # Deal details > Photo Modal """ 1.Navigate to deal with no uploaded photos Expected : Button to upload “New photo” should be over google street view photo greyed out """ default_photo = "//span[contains(text(),'New photo')]" def VerifyButtonToUploadNewPhoto(self): time.sleep(2) self.deal.AddNewDeal() time.sleep(2) text = "New photo" text_photo = self.getText(self.default_photo) time.sleep(2) self.verifyTextContains(actualText=text, expectedText=text_photo) # TC -02 "Uploading “main” photo replaces Google street view photo" """ Steps: 1.Navigate to deal with no uploaded photos 2.Hover over the default google street view photo 3.Click on the prompt to add “New photo” 4.Upload photo Expected : The uploaded photo should replace the google street view photo in the grid """ def VerifyUploadPhotoReplaceDefaultPhoto(self): time.sleep(2) self.dealdetail.AddPhotos() # TC-03 Clicking on a photo launches photo grid modal """ "Clicking on a photo launches photo grid modal" 1.Navigate to deal with at least one uploaded photo 2.Click on uploaded photo in the photo grid Expected : 1.Photo viewing modal should be launched and should see all targets with upload link next to target name """ def ClickingOnAPhotoLaunchesPhotoGridModal(self): time.sleep(2) self.dealdetail.VerifyPhotoAddedSuccessfully() # TC-04 "User can upload untagged photo" """ "User can upload untagged photo" 1.Navigate to deal with no uploaded photos 2.Click on photo grid slot that does NOT have a photo tag label 3.Upload a photo Expected : The preview for that slot in the photo grid should be replaced with a preview of the uploaded photo """ untagged_photo = ".sc-108qnys-0:nth-child(1)" # change might be needed def UserCanUploadUntaggedPhoto(self): time.sleep(2) self.elementClick(self.untagged_photo, locatorType='css') time.sleep(2) name = "C:/Users/Sagar/PycharmProjects/DealTrack/images/R0010005.JPG" self.dealdetail.UploadDocuments(name) time.sleep(4) self.dealdetail.ClickUploadButton() time.sleep(25) self.dealdetail.VerifyPhotoAddedSuccessfully() # TC-05 "Untagged photo slot keeps count of all untagged photos " """ "Untagged photo slot keeps count of all untagged photos " 1.Navigate to deal with no uploaded photos 2.Click on photo grid slot that does NOT have a photo tag label 3.Upload four photos Expected: There should be a count at the top of that photo grid slot that says “+3 more” """ other_photos_upload_link = "//div[7]//div[1]//div[1]//strong[1]" count_untagged_photo = "//div[contains(text(),'+ 3 more')]" click_other_photo_after_upload = ".tag:nth-child(6) > img" def UntaggedPhotoSlotKeepsCountOfAllUntaggedPhotos(self): time.sleep(4) self.dealdetail.ClickUploadedImage() time.sleep(2) self.innerScroll(self.other_photos_upload_link) time.sleep(2) for i in range(0, 3): self.elementClick(self.other_photos_upload_link) time.sleep(2) name = "C:/Users/Sagar/PycharmProjects/DealTrack/images/R0010005.JPG" self.dealdetail.UploadDocuments(name) time.sleep(4) self.dealdetail.ClickUploadButton() time.sleep(25) self.dealdetail.ClickPhotoModalCloseIcon() time.sleep(2) text = "+ 3 more" text_untagged_photo = self.getText(self.count_untagged_photo) self.verifyTextContains(actualText=text, expectedText=text_untagged_photo) # TC-06 Deal details > Adding/editing photo tags """ Preconditions User should be on deal details screen Images should be attached Steps: "Order of the tags on photos from deal details page" 1.Click on any deal from the dealist screen 2.Add photos if not added 3.Click on "..." icon from any uploaded photo 4.Click on Add tag option 5.Select any of the tag 6.Repeat steps 3-5 on remaining photos 7.Click on Save button Expected: Order of tagged photos should be : - Main - Streetscape - Signage - Interior - Exterior - Lobby """ photo_menu_icon = ".photo-tour--tag-group:nth-child(1) .sc-1dok22n-0" edit_photo_tag = "//strong[contains(text(),'Edit photo tag')]" streetscape = "//p[contains(text(),'Streetscape')]" save_button = "//button[contains(text(),'Save')]" def ClickPhotoMenuIcon(self): self.elementClick(self.photo_menu_icon, locatorType='css') def EditTag(self): time.sleep(2) self.dealdetail.ClickUploadedImage() time.sleep(2) self.ClickPhotoMenuIcon() time.sleep(2) self.elementClick(self.edit_photo_tag) time.sleep(2) self.elementClick(self.streetscape) time.sleep(2) self.elementClick(self.save_button) signage_upload_link = ".photo-tour--tag-group:nth-child(3) .Strong-sc-jrot7n" click_uploaded_image = "//div[@id='app']/div/div[2]/div/div/div/div[2]/div/div[3]/div[2]/div/div/img" zoom_button = "(//button[@type='button'])[3]" close_icon = ".ril-close" def ClickUploadSignageToAddPhoto(self): time.sleep(4) self.elementClick(self.signage_upload_link, locatorType='css') time.sleep(3) name = "C:/Users/Sagar/PycharmProjects/DealTrack/images/R0010005.JPG" self.dealdetail.UploadDocuments(name) time.sleep(4) self.dealdetail.ClickUploadButton() time.sleep(25) self.elementClick(self.click_uploaded_image) self.elementPresenceCheck(self.zoom_button, byType='xpath') time.sleep(2) self.elementClick(self.close_icon, locatorType='css') click_upload_new_photo_main_section = "//div[@id='app']/div/div[2]/div/div/div/div[2]/div/div/div[2]/div/div/div/span/span" remove_tag = "//button[contains(text(),'Remove tag')]" count_untagged_photo_after_update = "//div[contains(text(),'+ 4 more')]" def RemoveTag(self): time.sleep(2) self.elementClick(self.click_upload_new_photo_main_section) time.sleep(2) name = "C:/Users/Sagar/PycharmProjects/DealTrack/images/R0010005.JPG" self.dealdetail.UploadDocuments(name) time.sleep(4) self.dealdetail.ClickUploadButton() time.sleep(20) self.ClickPhotoMenuIcon() time.sleep(2) self.elementClick(self.edit_photo_tag) time.sleep(2) self.elementClick(self.remove_tag) time.sleep(2) self.dealdetail.ClickPhotoModalCloseIcon() time.sleep(2) text = "+ 4 more" text_untagged_photo = self.getText( self.count_untagged_photo_after_update) self.verifyTextContains(actualText=text, expectedText=text_untagged_photo) delete_photo_link = "//strong[contains(text(),'Delete photo')]" delete_button = "//button[contains(text(),'Delete photo')]" def DeletePhoto(self): time.sleep(2) self.VerifyUploadPhotoReplaceDefaultPhoto() time.sleep(2) self.dealdetail.ClickUploadedImage() time.sleep(2) self.ClickPhotoMenuIcon() time.sleep(2) self.elementClick(self.delete_photo_link) time.sleep(4) self.elementClick(self.delete_button) time.sleep(4) self.elementPresenceCheck(self.click_upload_new_photo_main_section, byType='xpath')
class MeetingNotesPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deall = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.request = RequestRevisionPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.driver = driver temp_update_floor_button = "//span[contains(text(),'Update floors')]" element1 = "//tr[1]//td[7]//div[1]//img[2]" def VerifyMeetingNoteButton(self): time.sleep(4) self.deall.ClickBackArrow() time.sleep(2) self.deall.MoreFilterIcon() time.sleep(2) self.deall.ClickStageField() time.sleep(2) self.request.SelectBToA() time.sleep(2) self.deall.ClickApplyButton() time.sleep(4) for i in range(6): if not self.isElementDisplayed( self.release.add_meeting_notes_button): self.unrelease.ClickMenuIcon() time.sleep(2) self.deall.MoreFilterIcon() time.sleep(2) self.deall.ClickApplyButton() time.sleep(3) else: break self.elementPresenceCheck(self.release.add_meeting_notes_button, byType='xpath') # adding meeting note by clicking on add meeting note button and then entering all the values. def AddMeetingNotes(self): self.release.AddMeetingNote() click_meeting_notes_from_note_section = ".sc-1nmm7de-0 svg" click_added_meeting_note = "//span[contains(text(),'B to A release')]" scroll_to_notes = "//a[contains(text(),'Notes')]" # verify added meeting note is showing in notes section def VerifyAddedMeetingNotesOnNotesSection(self): time.sleep(2) self.elementClick(self.scroll_to_notes) time.sleep(4) self.elementPresenceCheck(self.click_added_meeting_note, byType='xpath') select_c = "//div[5]/div/div/div[2]/div[4]/div/img" # add meeting notes from c to b process def VerifyMeetingNotesButtonFromCtoB(self): time.sleep(4) self.deall.MoreFilterIcon() time.sleep(2) self.elementClick(self.deall.reset_button) time.sleep(2) self.deall.ClickStageField() time.sleep(2) self.elementClick(self.select_c) time.sleep(2) self.deall.ClickApplyButton() time.sleep(4) for i in range(5): if self.isElementDisplayed(self.temp_update_floor_button): element_to_hover_over = self.getElement(self.element1) self.log.info('element found') hoverover = ActionChains(self.driver).move_to_element( element_to_hover_over).click().perform() self.log.info('element clicked') self.dealdetail.EnteringFloorValues() time.sleep(4) self.release.ReleaseProcessCTOB() time.sleep(3) self.dealdetail.SubmitButton() else: break time.sleep(5) self.release.ReleaseProcessCTOB() time.sleep(2) self.dealdetail.SubmitButton() time.sleep(4) if self.isElementDisplayed(self.temp_update_floor_button): self.elementClick(self.temp_update_floor_button) time.sleep(2) self.dealdetail.EnteringFloorValues() time.sleep(4) self.elementPresenceCheck(self.release.add_meeting_notes_button, byType='xpath') def EnterValueInMeetingNotesModalBoxFromCToB(self): time.sleep(2) self.release.AddMeetingNote() click_added_meeting_note_from_c_to_b = "//span[contains(text(),'C to B release')]" def VerifyAddedMeetingNotesOnNotesSectionFromCtoB(self): time.sleep(2) self.elementClick(self.scroll_to_notes) time.sleep(4) self.elementPresenceCheck(self.click_added_meeting_note_from_c_to_b, byType='xpath') ''' To verify the ticket we have to scroll the screen to top and then click on cancel button Steps: 1. Scroll to top 2. Click cancel button 3. Click submit button 4. Full release process 5. Click add meeting note button Expected: Verify meeting note modal box should be empty. ''' def PreviousMeetingNoteIsDisplayedAndEditableWhenReleaseIsCancelled(self): time.sleep(2) # self.innerScrollUp(self.dealdetail.click_description) # time.sleep(2) self.request.ClickDealDetailPageCancelButton() time.sleep(2) self.release.ReleaseProcessCTOB() time.sleep(2) self.dealdetail.SubmitButton() time.sleep(4) if self.isElementDisplayed(self.temp_update_floor_button): self.elementClick(self.temp_update_floor_button) time.sleep(2) self.dealdetail.EnteringFloorValues() time.sleep(3) self.elementClick(self.release.add_meeting_notes_button) time.sleep(2) textbox = self.getElement( self.release.enter_meeting_notes).get_attribute('value') if textbox == '': self.log.info("empty") assert True else: self.log.info("not empty") assert False
class ExternalCounselPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.broker = BrokerPages(self.driver) self.landlord = LandlordPages(self.driver) self.ut = Util() self.driver = driver # Display External counsel ''' Pre condition : User should be on deal details screen Note : Save button will be disabled until Firm has been added Steps: "External counsel appears below broker" 1.Scroll to broker section 2.Look below Expected: User should see external counsel section ''' contacts = "//a[contains(text(),'Contacts')]" text_external_counsel = "//h4[contains(text(),'External counsel')]" def ClickContacts(self): self.elementClick(self.contacts) def UserShouldSeeExternalCounselSection(self): self.deal.AddNewDeal() time.sleep(2) self.ClickContacts() time.sleep(2) self.elementPresenceCheck(self.text_external_counsel, byType='xpath') ''' "External counsel has empty state" Add a new deal Go to new deal's deal details page Look at external counsel section Expected: Should say "Add external counsel" ''' empty_label_text = "//p[contains(text(),'Add external counsel')]" def ExternalCounselHasEmptyState(self): time.sleep(2) self.elementPresenceCheck(self.empty_label_text, byType='xpath') ''' "Clicking on external counsel section launches edit modal" 1.Go to external counsel section 2.Click section Expected: External counsel modal launches ''' click_add_external_contact = ".contact--add" def ClickAddExternalContact(self): self.elementClick(self.click_add_external_contact, locatorType='css') def ClickingOnExternalCounselSectionLaunchesEditModal(self): time.sleep(2) self.elementClick(self.text_external_counsel) time.sleep(2) self.isElementDisplayed(self.click_add_external_contact, locatorType='css') ''' "Clicking "+ add external counsel" shows typeahead" 1.Scroll to external counsel section 2.Launch external counsel modal 3.Click on blue text that says "+ Add external counsel" Expected: Typeahead component should appear that has label "Firm name" ''' firm_label = ".contact-search--input-label" def ClickingAddExternalCounselShowsTypeahead(self): time.sleep(2) self.ClickAddExternalContact() time.sleep(2) self.isElementDisplayed(self.firm_label, locatorType='css') # User can search for existing firms ''' Preconditions User is logged into Dealtrack User is on deal details page of deal with no external counsel Steps 1.Scroll to external counsel section 2.Launch external counsel modal 3.click on blue text that says "+ Add external counsel" 4.Start typing in typeahead component Expected Result Dropdown should appear and results should populate if there are any bottom of dropdown should have blue text that says "+ Create "[text that user is typing in search]"" ''' add_new_firm_textbox = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div/div/div/input" click_existing_firm = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div/div/div/div/div/div" def AddNewFirm(self, frimname): time.sleep(2) self.elementClick(self.add_new_firm_textbox) time.sleep(2) self.sendKeys(frimname, self.add_new_firm_textbox) def UserCanSearchForExistingFirms(self): time.sleep(2) firmname = 'law' self.AddNewFirm(firmname) time.sleep(2) self.elementClick(self.click_existing_firm) # user can search for existing lawyer at firm or add new lawyer ''' Preconditions User is logged into Dealtrack User is on deal details page of deal with no external counsel Steps: 1.Scroll to external counsel section 2.Launch external counsel modal 3.click on blue text that says "+ Add external counsel" 4.Type [some new value] into typeahead component 5.Select existing firm 6.In new card, click "add lawyer" Expected Result Typeahead should pre-populate with lawyers that exist at the firm already ''' lawyer_textbox = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div/div/div[3]/div/div/input" def EnterLawyer(self, landlord): self.elementClick(self.lawyer_textbox) time.sleep(2) self.sendKeys(landlord, self.lawyer_textbox) def RandomLawyerName(self): landname = 'landlord' name = self.ut.getUniqueName(4) name = landname + name self.EnterLawyer(name) verify_entered_lawyer = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/strong" def UserCanSearchForExistingLawyerAtFirmOrAddNewLawyer(self): time.sleep(2) self.ClickAddExternalContact() self.RandomLawyerName() time.sleep(2) self.broker.ClickCreateNew() time.sleep(2) self.elementPresenceCheck(self.verify_entered_lawyer, byType='xpath') # There can be multiple lawyers assigned to a deal ''' Preconditions User is logged into Dealtrack User is on deal details page of deal with pre-existing external counsel firm and lawyers Steps 1.Click on external counsel section to launch modal 2.In modal, click "add lawyer" underneath current lawyers Expected Result User should be able to add as many lawyers as they want. They are displayed on the deal details page side by side in card view ''' def ThereCanBeMultipleLawyersAssignedToADeal(self): time.sleep(2) for i in range(1, 4): self.ClickAddExternalContact() time.sleep(2) self.RandomLawyerName() time.sleep(2) self.broker.ClickCreateNew() time.sleep(2) self.elementClick(self.landlord.save_button) # Test 1. User is on deal details page of deal with external counsel that has firm and lawyers ''' Preconditions User is logged into Dealtrack Test 1. User is on deal details page of deal with external counsel that has firm and lawyers Steps: Look at external counsel section Expected Result: Section should say "External counsel" Test 1 & 2: Firm should be displayed in bold text w/ icon ''' lawyer_check = ".gvEbHU:nth-child(1)" def ExternalCounselThatHasFirmAndLawyers(self): time.sleep(2) self.elementPresenceCheck(self.counsel_icon, byType='xpath') self.isElementPresent(self.lawyer_check, locatorType='css') # Functionality behind removing Firm name and lawyers ''' Preconditions User is logged into Dealtrack User is on deal details page of deal with pre-existing external counsel firm and one lawyer "User can remove lawyer by clicking 'x'" 1.Launch external counsel modal 2.On list of lawyers, click x next to lawyers name Expected: lawyer should be removed from the list their should be no lawyers left user should be able to save ''' close_icon = "//div[@class='lawyer--search']//div[1]//img[2]" def UserCanRemoveLawyerByClickingX(self): time.sleep(2) self.elementClick(self.text_external_counsel) time.sleep(2) for i in range(1, 5): time.sleep(1) a = "//div[@class='lawyer--search']//div" x = [i] c = "//img[2]" icon = a + str(x) + c time.sleep(2) self.elementClick(icon) time.sleep(2) self.elementClick(self.landlord.save_button) # External counsel section shows firm. # Test 2. User is on deal details page of deal with external counsel that only has firm ''' Steps: Look at external counsel section Expected: Test 2: lawyers should each have a card with full name ''' counsel_icon = "//img[@class='counsel--icon']" def ExternalCounselShowsOnlyLawyers(self): time.sleep(2) self.elementPresenceCheck(self.counsel_icon, byType='xpath') # "When user clicks 'x' next to firm, it clears firm name and lawyers" ''' "When user clicks 'x' next to firm, it clears firm name and lawyers" 1.Launch external counsel modal 2.Click x next to firm name Expected: user should see "+ add external counsel" button save button should be disabled ''' firm_close_icon = ".firm--ex-icon" def WhenUserRemoveFirmUsingCrossIcon(self): time.sleep(2) self.elementClick(self.text_external_counsel) time.sleep(2) self.elementClick(self.firm_close_icon, locatorType='css') time.sleep(4) self.elementPresenceCheck(self.add_new_firm_textbox)
def __init__(self, driver): super().__init__(driver) self.deall = DealList(self.driver) self.driver = driver
class BrokerPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.release = ReleasePage(self.driver) self.ut = Util() self.driver = driver # C54671 Deal details > Broker ''' Preconditions User should be logged into the app Step "Clicking broker section opens broker modal" 1.User should scroll down to the broker section 2.User should click on the section Expected: Broker modal should open ''' broker = "//h4[contains(text(),'Broker')]" verify_edit_broker_modalbox = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/h2" def ClickingBrokerSectionOpensBrokerModal(self): time.sleep(2) self.deal.AddNewDeal() time.sleep(2) self.innerScroll(self.dealdetail.scroll_to_team) time.sleep(2) self.elementClick(self.broker) time.sleep(2) text = "Edit broker" broker_text = self.getText(self.verify_edit_broker_modalbox) self.verifyTextContains(actualText=broker_text, expectedText=text) # Deal details page has empty broker section ''' "Deal details page has empty broker section" Precondition : - User should be logged into the app - User should be on deal details screen - There should be no broker yet 1.User should scroll down to the broker section Expected Result It should say "Add Broker" ''' add_broker_link = "//p[contains(.,'+ Add broker')]" def DealDetailsPageHasEmptyBrokerSection(self): time.sleep(2) text = "+ Add broker" text_link = self.getText(self.add_broker_link) self.verifyTextContains(actualText=text, expectedText=text_link) ''' "Deal details page has "not applicable" broker section " Preconditions - User should be logged into the app - User should be on deal details screen - Broker should be not applicable (Find/Create a deal with Broker as "not applicable") 1.Scroll down to broker section Expected : There should be text in the broker section that says "Not applicable" ''' not_applicable_link = "//p[contains(.,'Not applicable')]" def DealDetailsPageHasNotApplicableBrokerSection(self): time.sleep(2) text = "Not applicable" text_link = self.getText(self.not_applicable_link) self.verifyTextContains(actualText=text, expectedText=text_link) # Submit button should be disabled ''' "Save is disabled until a broker or "not applicable" is selected" 1.Scroll down to broker section 2.Click on section, to open modal Expected : Submit button should be disabled ''' save_button = "//button[contains(text(),'Save')]" def SubmitButtonShouldBeDisabled(self): time.sleep(2) element = self.getElement(self.save_button) result = element.is_enabled() self.log.info(result) return result # "User can search or create a broker" ''' "User can search or create a broker" 1.Scroll down to broker section 2.Click on section, to open modal 3.In modal, select "Add broker" Expected : User sees search typing into search triggers a dropdown list of brokers and an "add broker" option ''' broker_textbox = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div/div/input" after_adding_broker = ".broker--name" select_broker = "//p[contains(.,'Gaurav Dave')]" def EnterBroker(self, brokername): self.elementClick(self.broker_textbox) time.sleep(2) self.sendKeys(brokername, self.broker_textbox) def UserCanSearchAndCreateABroker(self): time.sleep(2) self.elementClick(self.add_broker_link) time.sleep(2) brokername = "Gaurav dave" self.EnterBroker(brokername) self.elementClick(self.select_broker) time.sleep(2) self.elementClick(self.save_button) time.sleep(2) verify_broker = self.getText(self.after_adding_broker, locatorType='css') self.verifyTextContains(actualText=verify_broker, expectedText=brokername) # "User can edit contact " ''' "User can edit contact " 1.Scroll down to broker section 2.Click on section, to open modal 3.In modal, select "Add broker" 4.Search and select an existing broker Expected : A card should appear under the existing brokers name with info filled in User should be able to edit that info ''' edit_contact_text_box = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div[2]/div/div/input" select_edit_contact = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/div/div[2]/div/div/div/div/div" verify_edit_contact_on_detail_page = "//p[contains(.,'*****@*****.**')]" ''' Steps: 1. Click broker 2. Enter contact name 3. Select from suggestion list 4. Click save button Verify added info on deal detail screen ''' def EditContactBox(self, contactname): self.elementClick(self.edit_contact_text_box) time.sleep(2) self.sendKeys(contactname, self.edit_contact_text_box) def UserCanEditContacts(self): time.sleep(2) self.elementClick(self.broker) time.sleep(2) contactname = "g" self.EditContactBox(contactname) time.sleep(2) self.elementClick(self.select_edit_contact) time.sleep(2) self.elementClick(self.save_button) time.sleep(3) email_contact = "*****@*****.**" emailcontact = self.getText(self.verify_edit_contact_on_detail_page) self.verifyTextContains(actualText=email_contact, expectedText=emailcontact) # "User can create a new contact" ''' "User can create a new contact" 1.Scroll down to broker section 2.Click on section, to open modal 3.In modal, select "Add broker" 4.Search and select an existing broker 5.Click on "Add Contact" 6.Enter Contact name 7.Enter contact email 8.press save Expected : Broker is selected and contact is stored. Broker section shows Broker company name with contact card with name and email of broker contact ''' click_create_new_broker = ".contact-search--create-option" contact_close_icon = ".contact--ex-icon" add_contact = ".contact--add" def ClickCreateNew(self): self.elementClick(self.click_create_new_broker, locatorType='css') def ClickAddContact(self): self.elementClick(self.add_contact, locatorType='css') def ClickContactCloseIcon(self): self.elementClick(self.contact_close_icon, locatorType='css') ''' Steps: 1. Click on broker 2. Click on close icon of added broker and remove it 3. Click add broker link 4. Enter broker name 5. Click create 6. Enter contact name 7. Click save button ''' def UserCanCreateANewContact(self): time.sleep(2) self.elementClick(self.broker) time.sleep(2) self.ClickContactCloseIcon() time.sleep(2) self.elementClick(self.add_broker_link) time.sleep(2) name = "broker" brokername = self.ut.getUniqueName(2) brokername = name + brokername self.EnterBroker(brokername) time.sleep(2) self.ClickCreateNew() time.sleep(2) self.ClickAddContact() time.sleep(2) name = "broker" contactname = self.ut.getUniqueName(2) contactname = name + contactname self.EditContactBox(contactname) time.sleep(2) self.ClickCreateNew() time.sleep(2) self.elementClick(self.save_button)
class ReleasePage(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.driver = driver # C27840 Release E>D ''' Preconditions User should be on deal details screen Steps 1.Click on Release to D button 2.Add Real estate manger in the first field of E>D modal box 3.Select any Product type from the drop-down menu 4.Click on Desks field and its value 5.Click on RSF field and its value 6.Add Est. C release date from calendar view 7.Add Possession date from calendar view 8.Select region 9.Select territory 10.Check Tour completed? field 11.Click on Submit button Expected Result Deal should get released to stage D ''' release_to_d_button = "//span[contains(text(),'Release to D')]" enter_value_real_state_manager = "//input[@placeholder='Enter a name']" #= "//div[@id='app']/div/div[2]/div/div/div/div/div/div[2]/div/div/div/input" #select_value_real_state_manager = "//li[contains(.,'Gaurav Dave')]" select_value_real_state_manager = "//li[2]/p" enter_desk = "//input[@name='desks']" enter_rsf = "//input[@name='rsf']" est_c_release_calendar = "//input[@id='estimatedReleaseFromDToCDate']" possession_date = "//input[@id='possessionDate']" add_floor_button_after_release = "//span[contains(text(),'Add floors')]" ''' import datetime base = datetime.datetime.now() for x in range(0, 3): a = (base + datetime.timedelta(days=x)) print(a.strftime("%m/%d/%Y")) ''' def ReleaseToDButton(self): self.elementClick(self.release_to_d_button) def EnterRealStateManager(self, name): # enter real state manager value. self.elementClick(self.enter_value_real_state_manager) time.sleep(2) self.sendKeys(name, self.enter_value_real_state_manager) def EnterCRelease(self, toDate): # Enter to date self.elementClick(self.est_c_release_calendar) time.sleep(2) self.sendKeys(toDate, self.est_c_release_calendar) def EnterPossession(self, possessionDate): # Enter possession date self.elementClick(self.possession_date) time.sleep(2) self.sendKeys(possessionDate, self.possession_date) ''' Steps: 1. Used add deal function wrriten in deal deal page and created a deal 2. Clicked on release to d button 3. Add Real estate manger in the first field of E>D modal box 3. Select any Product type from the drop-down menu 4. Click on Desks field and its value 5. Click on RSF field and its value 6. Add Est. C release date from calendar view 7. Add Possession date from calendar view 8. Select region 9. Select territory 10. Check Tour completed? field 11. Click on Submit button ''' add_broker_button = "//button[contains(text(),'Add/edit broker')]" add_broker_link = "//p[contains(.,'+ Add broker')]" broker_textbox1 = "//div[@id='app']/div/div[2]/div[2]/div/div/div/div/div/div/div/div/input" select_broker = "//p[contains(.,'Gaurav Dave')]" def EnterBroker(self, brokername): self.elementClick(self.broker_textbox1) time.sleep(2) self.sendKeys(brokername, self.broker_textbox1) def EnterBrokerValueByClickingAddEditBrokerButton(self): self.elementClick(self.add_broker_link) brokername = "Gaurav dave" self.EnterBroker(brokername) time.sleep(2) self.elementClick(self.select_broker) time.sleep(2) self.elementClick(self.dealdetail.click_team_save_button) time.sleep(2) def ReleaseEToD(self): time.sleep(2) self.deal.AddNewDeal() time.sleep(4) self.ReleaseToDButton() time.sleep(2) name = "Gaurav Dave" self.EnterRealStateManager(name) time.sleep(2) self.elementClick(self.select_value_real_state_manager) time.sleep(2) self.elementClick(self.add_broker_button) time.sleep(2) self.EnterBrokerValueByClickingAddEditBrokerButton() time.sleep(2) num = '100' self.dealdetail.EnterDeskValue(num) time.sleep(2) rsfnum = '100' self.dealdetail.EnterRSFValue(rsfnum) time.sleep(2) self.dateSelection() time.sleep(5) self.dealdetail.CheckLabelYes() time.sleep(2) self.dealdetail.SubmitButton() time.sleep(2) add_floor = "Update floors" addFloor = self.getText(self.temp_update_floor_button) self.verifyTextContains(actualText=addFloor, expectedText=add_floor) # Date selection method created to enter date for possession and opening date def dateSelection(self): base = datetime.datetime.now() for x in range(1, 3): if x == 1: a = (base + datetime.timedelta(days=x)) a = (a.strftime("%m/%d/%Y")) self.log.info(a) self.EnterCRelease(a) else: a = (base + datetime.timedelta(days=x)) a = (a.strftime("%m/%d/%Y")) self.log.info(a) time.sleep(2) self.EnterPossession(a) # Add Floor by clicking on Add Floor button # Enter all the values and click on save button temp_update_floor_button = "//span[contains(text(),'Update floors')]" button_request_release_to_c = "//span[contains(text(),'Request release')]" def ClickButtonReleaseToC(self): self.elementClick(self.button_request_release_to_c) def AddFloors(self): time.sleep(3) self.elementClick(self.temp_update_floor_button) time.sleep(2) # self.elementClick(self.temp_update_floor_button) # time.sleep(2) self.dealdetail.EnteringFloorValues() time.sleep(2) verify_button = self.getText(self.button_request_release_to_c) verify_button_text = "Request release" self.verifyTextContains(actualText=verify_button, expectedText=verify_button_text) # C27841 Release D>C ''' Preconditions User should be on deal details screen having stage D Floors info is added on deal Steps 1.Click on Release to C button 2.Click on Add file Excel link for adding FiMo file 3.Select proper excel file 4.Click on Next button 5.Add description of the deal 6.Select market if not selected 7.Add Landlord name in landlord name field 8.Add Landlord email id in landlord contract field 9.Click on Next button 10.Add approver name in the field 11.Approve the request if you are approver from deal details screen Expected Result Deal should get released to stage C ''' add_fimo_link_text = "Add file (Excel)" #upload_next_button_step1 = "//div[@id='app']/div/div[2]/div/div/div/div/div/div[4]/div[2]/button" next_button_step2 = "//div[2]/div[3]/button" upload_next_button_step1 = "//div[@class='button--wrapper wdunhr-0 kUWJWD']//button[@class='button--button'][contains(text(),'Next')]" description_field = "//textarea[@placeholder='Describe the deal']" click_add_edit_landlord = "//button[contains(text(),'Add/edit landlord')]" enter_landlord_name = "//input[@placeholder='Company name']" select_landlord = "//p[contains(.,'Gunners')]" click_save_button = "//span[contains(text(),'Save')]" enter_approver = "//div[1]/div/div[2]/div/div/div[1]/div/div/div[3]/div/div/div[1]/div[1]/div/input" select_approver = "//li[2]/p" request_change_button_for_verification = "//span[contains(text(),'Request changes')]" approve_release_button = "//span[contains(text(),'Approve release')]" click_approve_button = "//div[@id='app']/div/div[2]/div/div/div/div/div/div[2]/button/span" def ClickApproveButtonAfterMovingFromXtoY(self): self.elementClick(self.approve_release_button) def ClickNextButton(self): time.sleep(5) self.elementClick(self.upload_next_button_step1) def ClickSaveButton(self): self.elementClick(self.click_save_button) def EnterDescriptionRelease(self, desc): self.elementClick(self.description_field) time.sleep(1) self.sendKeys(desc, self.description_field) def EnterLandlordName(self, name): self.elementClick(self.enter_landlord_name) time.sleep(2) self.sendKeys(name, self.enter_landlord_name) def AddApprover(self, approver_name): self.elementClick(self.enter_approver) time.sleep(2) self.sendKeys(approver_name, self.enter_approver) def AddFileMemoSheet(self): self.elementClick(self.add_fimo_link_text, locatorType='link') time.sleep(2) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/v4.2_Proforma(1).xlsb" self.dealdetail.UploadDocuments(doc) def ApproveReleaseButtonClick(self): self.elementClick(self.approve_release_button) time.sleep(3) self.elementClick(self.click_approve_button) def SelectLandlordFromAddEditButton(self): time.sleep(2) self.elementClick(self.click_add_edit_landlord) time.sleep(2) name = 'gunner' self.EnterLandlordName(name) time.sleep(2) self.elementClick(self.select_landlord) time.sleep(2) self.ClickSaveButton() def ReleaseDToCForm(self): time.sleep(2) self.elementClick(self.button_request_release_to_c) time.sleep(2) self.AddFileMemoSheet() time.sleep(45) self.log.info("hiiii pass") self.ClickNextButton() time.sleep(2) desc = "Running automation release from D - C" self.EnterDescriptionRelease(desc) self.SelectLandlordFromAddEditButton() time.sleep(2) self.elementClick(self.next_button_step2) time.sleep(2) approver_name = 'Gaurav Dave' self.AddApprover(approver_name) time.sleep(2) self.elementClick(self.select_approver) time.sleep(2) self.dealdetail.SubmitButton() time.sleep(8) verify_deal_after_completion = self.getText( self.request_change_button_for_verification) text_verify = "Request changes" self.verifyTextContains(actualText=verify_deal_after_completion, expectedText=text_verify) def ReleaseDToC(self): self.ReleaseDToCForm() self.ApproveReleaseButtonClick() # C27842 Release C>B ''' Preconditions User should be on deal details screen having stage C Floors info is added on deal Steps 1.Click on Release to B button 2.Click on Add file link of Deal Memo field 3.Select deal memo file and upload it 4.Click on Add file link of Term sheet field 5.Select Term sheet file and upload it 6.Click on Add file link of Financial model field 7.Select FiMo file and upload it 8.Click on Next button 9.Confirm deal team members by adding members in each field 10.Click on Next button after adding members 11.Add regional approver(user can add his name also in the field) 12.Click on Submit button, after confirming global approver 13.Ask approvers to approve the request Expected Result Deal should get released to stage B ''' button_request_release_to_b = "//span[contains(text(),'Request release')]" add_termsheet = "Add file (PDF, Doc)" add_deal_memo = "Add file (PDF)" select_date_leasing_sign = "//input[@id='date']" add_additional_financial_model = "//div[4]//p[2]//a[1]" def AddTermSheet(self): self.elementClick(self.add_termsheet, locatorType='link') time.sleep(2) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/1.pdf" self.dealdetail.UploadDocuments(doc) time.sleep(10) def AddDealMemo(self): self.elementClick(self.add_deal_memo, locatorType='link') time.sleep(2) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/DealMemo.pdf" self.dealdetail.UploadDocuments(doc) time.sleep(20) def AddAdditionalFinancialModelPDf(self): self.elementClick(self.add_additional_financial_model) time.sleep(2) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/1.pdf" self.dealdetail.UploadDocuments(doc) time.sleep(15) def EnterLeaseSigningDate(self, leasesign): self.elementClick(self.select_date_leasing_sign) time.sleep(2) self.sendKeys(leasesign, self.select_date_leasing_sign) def ReleaseProcessCTOB(self): time.sleep(3) self.elementClick(self.button_request_release_to_b) time.sleep(2) self.AddFileMemoSheet() time.sleep(35) self.AddDealMemo() self.AddTermSheet() self.AddAdditionalFinancialModelPDf() time.sleep(2) self.ReleaseProcessCtoBStep2() def ReleaseProcessCtoBStep2(self): self.elementClick(self.upload_next_button_step1) time.sleep(2) base = datetime.datetime.now() for x in range(1, 2): # adding method to select lease signing date if x == 1: a = (base + datetime.timedelta(days=x)) a = (a.strftime("%m/%d/%Y")) self.log.info(a) self.EnterLeaseSigningDate(a) time.sleep(2) self.dealdetail.SelectTransactionManager() time.sleep(2) self.dealdetail.SelectRealStateAnalystValue() time.sleep(2) self.dealdetail.SelectSourcer() #time.sleep(2) #self.dealdetail.SelectInternalCounsel() #time.sleep(2) self.elementClick(self.next_button_step2) time.sleep(2) name = "Gaurav Dave" self.EnterRealStateManager(name) self.elementClick(self.select_value_real_state_manager) time.sleep(2) # Global approvers do not exist on C>B deals ''' "In C>B release request, user cannot add global approvers" Navigate to deal in stage C Click CTA to “Request release to B (Leasing)” Upload all required docs and click next Enter all deal team member slots and click next Expected : On “Add approvers” section, “Global committee” section should not have options to add users and should read “Global Approvers are not required for C>B deals” “Regional committee” section should have ability to add approvers ''' global_approver_text_on_popup = "//p[contains(text(),'Global Approvers are not required for C>B deals')]" def VerifyGlobalApproversDoNotExistOnCToBDeals(self): self.ReleaseProcessCTOB() ### not required now as per the new flow #$text = "Global Approvers are not required for C>B deals" #globe_text = self.getText(self.global_approver_text_on_popup) #self.verifyTextContains(actualText=text, expectedText=globe_text) # adding meeting note method add_meeting_notes_button = "//span[contains(text(),'Add meeting notes')]" enter_meeting_notes = "//textarea[@placeholder='Enter text here']" enter_meeting_date = "//input[@id='regionalCommitteeMeetingDate']" enter_time = ".tdxc9i-0" def AddMeetingNoteButton(self): self.elementClick(self.add_meeting_notes_button) def EnterMeetingNote(self, text): self.elementClick(self.enter_meeting_notes) time.sleep(2) self.sendKeys(text, self.enter_meeting_notes) def EnterMeetingDate(self, a): self.elementClick(self.enter_meeting_date) time.sleep(2) base = datetime.datetime.now() a = (base + datetime.timedelta()) a = (a.strftime("%m/%d/%Y")) self.log.info(a) self.sendKeys(a, self.enter_meeting_date) def EnterTime(self, tt): time.sleep(2) self.sendKeys(tt, self.enter_time, locatorType='css') def PressArrowKey(self, value): self.sendKeys(value, self.enter_time, locatorType='css') def AddMeetingNote(self): time.sleep(2) self.elementClick(self.add_meeting_notes_button) self.EnterValueInMeetingNotesModalBox() self.ClickSaveButton() def EnterValueInMeetingNotesModalBox(self): time.sleep(2) text = 'This is automatic meeting notes' self.EnterMeetingNote(text) time.sleep(2) base = datetime.datetime.now() a = (base + datetime.timedelta()) a = (a.strftime("%m/%d/%Y")) self.log.info(a) self.EnterMeetingDate(a) time.sleep(2) tt = "1212PM" self.elementClick(self.enter_time, locatorType='css') self.PressArrowKey(Keys.ARROW_LEFT) self.PressArrowKey(Keys.ARROW_LEFT) self.EnterTime(tt) time.sleep(2) def ReleaseCToB(self): self.dealdetail.SubmitButton() time.sleep(4) self.ApproveReleaseButtonClick() time.sleep(4) self.AddMeetingNote() time.sleep(3) button = self.getText(self.move_to_b_button) button_text = "Release to B" self.verifyTextContains(actualText=button, expectedText=button_text) move_to_b_button = "//span[contains(text(),'Release to B')]" button_release = "//button[contains(text(),'Release')]" release_to_a_button = "//span[contains(text(),'Request release')]" def ReleaseMoveToB(self): time.sleep(2) self.elementClick(self.move_to_b_button) time.sleep(2) self.deal.SelectFirstDateFromCalendar() time.sleep(4) base = datetime.datetime.now() for x in range(1, 2): # adding method to select lease signing date if x == 1: a = (base + datetime.timedelta(days=x)) a = (a.strftime("%m/%d/%Y")) self.log.info(a) self.EnterLeaseSigningDate(a) time.sleep(2) self.elementClick(self.button_release) #time.sleep(3) #button = self.getText(self.release_to_a_button) #button_text = "Request release" #self.verifyTextContains(actualText=button, expectedText=button_text) approver_1 = "//div[3]/div/div/div/div[1]/div/div/input" approver_2 = "//div[3]/div/div/div/div[2]/div/div/input" approver_4 = "//div[3]/div/div/div/div[4]/div/div/input" close_icon = ".icon--close" select_value_real_state_manager_dhiraj = "//li[contains(.,'Dhiraj')]" def EnterApprover1(self, app1): self.elementClick(self.approver_1) time.sleep(2) self.sendKeys(app1, self.approver_1) def EnterApprover2(self, app2): self.elementClick(self.approver_2) time.sleep(2) self.sendKeys(app2, self.approver_2) def EnterApprover4(self, app4): self.elementClick(self.approver_4) time.sleep(2) self.sendKeys(app4, self.approver_4) def ClickCloseIcon(self): self.elementClick(self.close_icon, locatorType='css') def ReleasePopUpFieldEntry(self): time.sleep(2) self.elementClick(self.release_to_a_button) time.sleep(2) self.AddFileMemoSheet() time.sleep(45) self.AddDealMemo() time.sleep(2) self.AddTermSheet() time.sleep(2) self.AddAdditionalFinancialModelPDf() self.ClickNextButton() time.sleep(2) self.elementClick(self.next_button_step2) time.sleep(2) app1 = "Gaurav Dave" self.EnterApprover1(app1) self.elementClick(self.select_value_real_state_manager) time.sleep(2) # self.ClickCloseIcon() # app2 = "Gaurav Dave" # self.EnterApprover2(app2) # self.elementClick(self.select_value_real_state_manager) time.sleep(2) app4 = "Gaurav Dave" self.EnterApprover4(app4) time.sleep(2) self.elementClick(self.select_value_real_state_manager) def ReleaseToA(self): self.ReleasePopUpFieldEntry() time.sleep(2) self.dealdetail.SubmitButton() time.sleep(2) self.ApproveReleaseButtonClick()
class ComparablePage(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.meeting = MeetingNotesPages(self.driver) self.driver = driver # User sees comparables in stages C, B, A ''' Preconditions User is logged in User is in stage C, B or A Steps Look at deal details page below financials Expected Result There should be a Comparables component ''' click_comparable = "//a[contains(text(),'Comparables')]" compare_this_deal_to_text = "//span[contains(text(),'Compare this deal to')]" def VerifyComparabaleInC(self): time.sleep(2) self.deal.ClickBackArrow() time.sleep(2) self.unrelease.GlobalFilterSelection() time.sleep(2) self.elementClick(self.meeting.select_c) time.sleep(2) self.deal.ClickApplyButton() time.sleep(4) self.elementClick(self.click_comparable) time.sleep(2) self.elementPresenceCheck(self.compare_this_deal_to_text, byType='xpath') select_b = "//div[5]/div/div/div[2]/div[6]/div/img" def SelectB(self): self.elementClick(self.select_b) def VerifyComparableSectionInB(self): time.sleep(2) self.unrelease.GlobalFilterSelection() time.sleep(2) self.SelectB() time.sleep(2) self.deal.ClickApplyButton() time.sleep(4) self.elementClick(self.click_comparable) time.sleep(2) self.elementPresenceCheck(self.compare_this_deal_to_text, byType='xpath') select_a = "//div[5]/div/div/div[2]/div[8]/div/img" def SelectA(self): self.elementClick(self.select_a) def VerifyComparableSectionInA(self): time.sleep(2) self.unrelease.GlobalFilterSelection() time.sleep(2) self.SelectA() time.sleep(2) self.deal.ClickApplyButton() time.sleep(2) self.elementClick(self.click_comparable) time.sleep(2) self.elementPresenceCheck(self.compare_this_deal_to_text, byType='xpath') # Comparables dropdown defaults to market average ''' Preconditions User is logged in User is in stage C, B or A Steps Look at comparables section Expected Result The data defaults to compare to market average Explanatory footnote displayed under the table explaining the weighted averages. It should say: "* Avgs weighted by desk, except for total desks, RSF, and USF" ''' footnote = '''//*[@id="comparables"]/span[3]''' def ComparablesDropdownDefaultsToMarketAverage(self): time.sleep(2) self.elementPresenceCheck(self.footnote, byType='xpath') drop_down_list = '''//select[@name='comparables--name']''' default_text = "//option[@value='Pipeline average']" def DefaultTextDropdown(self): time.sleep(2) text = self.getText(self.default_text) original_text = "Pipeline average" self.verifyTextContains(actualText=text, expectedText=original_text) def CheckValueInDropDown(self): time.sleep(2) count = self.getText(self.drop_down_list) count = count.split() self.log.info(len(count))
class OverviewSectionPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.broker = BrokerPages(self.driver) self.landlord = LandlordPages(self.driver) self.ut = Util() self.driver = driver # Overview section should be beneath the photo grid ''' Preconditions User is logged into Dealtrack Steps Scroll to photogrid Look under photo grid Expected Result There should be a section representing a quick overview of the deal. It has the description of the deal on the left side and on the right you will see Details (Adjusted NPV, Free Rent, Product type. Below Details there is a Space section which includes USF, RSF, Desks, Floors and See more hyperlink. ''' detail_tag = "//span[contains(text(),'Details')]" adjusted_npv_tag = "//span[contains(text(),'Adjusted NPV')]" space_tag = "//span[contains(text(),'Space')]" see_more_link = "//strong[contains(text(),'See more >')]" rsf = "//span[contains(text(),'RSF')]" usf = "//span[contains(text(),'USF')]" desk = "//span[contains(text(),'Desks')]" floors = "//span[contains(text(),'Floors')]" def OverviewSectionShouldBeBeneathThePhotoGrid(self): time.sleep(2) self.deal.AddNewDeal() time.sleep(2) self.elementPresenceCheck(self.detail_tag, byType='xpath') self.elementPresenceCheck(self.adjusted_npv_tag, byType='xpath') self.elementPresenceCheck(self.space_tag, byType='xpath') self.elementPresenceCheck(self.see_more_link, byType='xpath') self.elementPresenceCheck(self.rsf, byType='xpath') self.elementPresenceCheck(self.usf, byType='xpath') self.elementPresenceCheck(self.desk, byType='xpath') self.elementPresenceCheck(self.floors, byType='xpath') # "See more" link launches floors modal ''' Preconditions User is logged into Dealtrack Steps Go to a deal in C Go to overview section Click on 'See More' text link next to "Space" heading Expected Result The floors edit modal should launch User should be able to do any floors related activities (add/remove floors, USF, RSF, Desks) Making changes in modal persists in overview section ''' add_floor_text = "//p[contains(text(),'Add floors')]" floor_count = "//div[@id='overview']//div[4]//div[1]//span[1]" enter_floor = "//div[@id='app']/div/div[2]/div/div/div/div[2]/div/input" enter_rsf = "//tr[2]//td[2]//input[1]" enter_usf = "//tr[2]//td[3]//input[1]" enter_desk = "//tr[2]//td[4]//input[1]" def EnterFloor(self, floor_num): self.elementClick(self.enter_floor) time.sleep(2) self.sendKeys(floor_num, self.enter_floor) def pressEnter(self, value): self.sendKeys(value, self.enter_floor) def EnterRSF(self, rsf_num): self.elementClick(self.enter_rsf) time.sleep(2) self.sendKeys(rsf_num, self.enter_rsf) def EnterUSF(self, usf_num): self.elementClick(self.enter_usf) time.sleep(2) self.sendKeys(usf_num, self.enter_usf) def EnterDesk(self, desk_num): self.elementClick(self.enter_desk) time.sleep(2) self.sendKeys(desk_num, self.enter_desk) def EnteringSecondFloorValues(self): floor_num = '3' self.EnterFloor(floor_num) time.sleep(2) self.pressEnter(Keys.ENTER) rsf_num = '10' self.EnterRSF(rsf_num) time.sleep(2) usf_num = '15' self.EnterUSF(usf_num) time.sleep(2) desk_num = '12' self.EnterDesk(desk_num) time.sleep(2) self.elementClick(self.dealdetail.click_Save_button) def SeeMoreLinkLaunchesFloorsModal(self): time.sleep(2) self.elementClick(self.see_more_link) time.sleep(2) self.elementPresenceCheck(self.add_floor_text, byType='xpath') def UserShouldBeAbleToADDFloors(self): time.sleep(2) self.dealdetail.EnteringFloorValues() time.sleep(2) text = self.getText(self.floor_count) expected = "1" self.verifyTextContains(actualText=text, expectedText=expected) def UserShouldBeAbleToUpdateFloors(self): time.sleep(2) self.elementClick(self.see_more_link) time.sleep(2) self.EnteringSecondFloorValues() time.sleep(2) text = self.getText(self.floor_count) expected = "2" self.verifyTextContains(actualText=text, expectedText=expected) # Validate TI allowance and Free Rent from proforma ''' Preconditions User is logged into dealtrack User must have excel Steps User finds/creates a deal in D. Release request to C and upload a proforma (4.2 proforma, add approvers (add yourself as an approver)) Open proforma in excel, unhide the submit to log tab look for Free rent from possession in months value, TI allowance value (currency) Expected Result The values in the proforma matches the values displayed in the overview section. ''' # Updating floors in modal, updates overview section ''' Preconditions User is logged into dealtrack User finds a deal with floors added Steps Click on the 'see more' hyperlink in overview section next to 'Space' Add an additional floor with RSF, USF, Desks Click save Expected Result Floor gets added and 'Space' in overview section is updated with the total value for RSF,USF, Desks, and Total number of floors ''' rsf_value = "(//span[@type='3'])[4]" usf_value = "(//span[@type='3'])[5]" desk_value = "(//span[@type='3'])[6]" def UpdatingFloorsInModalUpdatesOverviewSection(self): time.sleep(2) rsf_text = self.getText(self.rsf_value) usf_text = self.getText(self.usf_value) desk_text = self.getText(self.desk_value) time.sleep(2) rsf_expected = "20" usf_expected = "30" desk_expected = "24" self.verifyTextContains(actualText=rsf_text, expectedText=rsf_expected) self.verifyTextContains(actualText=usf_text, expectedText=usf_expected) self.verifyTextContains(actualText=desk_text, expectedText=desk_expected) # Adding Product type in Terms tab ''' Preconditions User is logged into dealtrack Steps Go to any deal Go to Terms tab Click on Product type Select an additional product type in multi-select dropdown Click save Expected Result Product types that were added persist in Terms tab and in overview section the product types are displayed with comma separating them ''' product_types = "(//span[@type='3'])[3]" click_overview = "//a[contains(text(),'Overview')]" def AddingProductTypeInTermsTab(self): time.sleep(2) self.elementClick(self.dealdetail.scroll_to_text) time.sleep(2) self.dealdetail.TermsTab() time.sleep(2) self.elementClick(self.click_overview) time.sleep(2) text = self.getText(self.product_types) expected = "Corporate" self.verifyTextContains(actualText=text, expectedText=expected)
class DocumentSpecificPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deall = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.release = ReleasePage(self.driver) self.unrelease = UnReleasePages(self.driver) self.request = RequestRevisionPages(self.driver) self.driver = driver # C63079 Document View """ Preconditions User is logged into dealtrack Create a new deal by clicking on the (+) on the bottom left side of the page, Add an address and Click Add Steps Scroll below General info tab Expected Result 'Documents' section is displayed with the following associated tags in this order (Financial model, term sheet, deal memo, lease first then the rest in alphabetical order) 1. Financial Model 2. Term Sheet 3. Deal Memo 4. Lease 5. Budget 6. Ops Rider 7. Programming package (pkg) 8. Project schedule 9. Test Fit 10. RevOps FiMo Below the associated file tag you have a grey thumbnail with a (+) icon in the center Below target tags there is an 'Other attachments' section with a (+) icon next to it to upload attachments. Depending on side of the page the documents thumbnail displays will shift, if screen is wide enough all the target tags will be on one row, number of rows increase depending on how small the screen is but the size of the thumbnail does not change """ scroll_to_documents = "//a[contains(text(),'Documents')]" financial_model = "//span[contains(text(),'Financial model')]" deal_memo = "//span[contains(text(),'Deal memo')]" lease = "//span[contains(text(),'Lease')]" budget = "//span[contains(text(),'Budget')]" ops_rider = "//span[contains(text(),'Ops rider')]" programing_pkg = "//span[contains(text(),'Programming pkg')]" project_schedule = "//span[contains(text(),'Project schedule')]" revops = "//span[contains(text(),'RevOps FiMo')]" testFit = "//span[contains(text(),'Test fit')]" def Scroll_to_documents(self): self.elementClick(self.scroll_to_documents) def VerifyDocumentView(self): time.sleep(2) self.deall.ClickBackArrow() time.sleep(2) self.deall.AddNewDeal() time.sleep(2) self.Scroll_to_documents() time.sleep(2) self.elementPresenceCheck(self.deal_memo, byType='xpath') self.elementPresenceCheck(self.financial_model, byType='xpath') self.elementPresenceCheck(self.lease, byType='xpath') self.elementPresenceCheck(self.budget, byType='xpath') self.elementPresenceCheck(self.ops_rider, byType='xpath') self.elementPresenceCheck(self.programing_pkg, byType='xpath') self.elementPresenceCheck(self.project_schedule, byType='xpath') self.elementPresenceCheck(self.revops, byType='xpath') self.elementPresenceCheck(self.testFit, byType='xpath') # Specific target tag upload view ''' Preconditions User is logged into dealtrack User has created a new deal and is in stage E: (https://wework.testrail.net/index.php?/cases/view/59784 ) Upload each documents one by one. ''' click_new_financial_model = ".sc-12w36a0-0:nth-child(2) svg" click_lease_upload_pdf = ".sc-12w36a0-0:nth-child(5) svg" click_budget_upload_xls = ".sc-12w36a0-0:nth-child(6) svg" click_ops_rider_upload_pdf = ".sc-12w36a0-0:nth-child(7) svg" click_programing_pkg_upload_pdf = ".sc-12w36a0-0:nth-child(8) svg" click_project_schedule_upload_pdf = ".sc-12w36a0-0:nth-child(9) svg" click_revOps_upload_xls = ".sc-12w36a0-0:nth-child(10) svg" click_test_fit_upload_pdf = ".sc-12w36a0-0:nth-child(10) svg" click_other_attachment_upload_pdf = ".sc-12w36a0-0:nth-child(12) svg" def UploadPDF(self): doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/1.pdf" self.dealdetail.UploadDocuments(doc) time.sleep(20) def UploadCSV(self): doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/v4.2_Proforma(1).xlsb" self.dealdetail.UploadDocuments(doc) time.sleep(45) def ClickNewFinancialModel(self): self.elementClick(self.click_new_financial_model, locatorType='css') self.UploadPDF() def LeaseUpload(self): self.elementClick(self.click_lease_upload_pdf, locatorType="css") self.UploadPDF() def BudgetUpload(self): self.elementClick(self.click_budget_upload_xls, locatorType="css") self.UploadCSV() def OpsRiderUpload(self): self.elementClick(self.click_ops_rider_upload_pdf, locatorType="css") self.UploadPDF() def ProgramingPkgUpload(self): self.elementClick(self.click_programing_pkg_upload_pdf, locatorType="css") self.UploadPDF() def ProjectScheduleUpload(self): self.elementClick(self.click_project_schedule_upload_pdf, locatorType="css") self.UploadPDF() def RevOpsUpload(self): self.elementClick(self.click_revOps_upload_xls, locatorType="css") self.UploadCSV() def TestFitUpload(self): self.elementClick(self.click_test_fit_upload_pdf, locatorType="css") self.UploadPDF() def OtherAttachmentUpload(self): self.elementClick(self.click_other_attachment_upload_pdf, locatorType="css") self.UploadPDF() def UploadDocumentOneByOne(self): time.sleep(2) self.dealdetail.TermSheetDocument() self.dealdetail.FinacialDocuments() self.dealdetail.DealMemo() self.ClickNewFinancialModel() self.LeaseUpload() self.BudgetUpload() self.OpsRiderUpload() self.ProgramingPkgUpload() self.ProjectScheduleUpload() self.RevOpsUpload() self.TestFitUpload() self.OtherAttachmentUpload() # Lease target upload """ Lease thumbnail has a locked icon and is not viewable and does not download when clicked on """ lock_icon = ".Regular-sc-178ixox path" def LockIcon(self): self.getElement(self.lock_icon, locatorType='css') def VerifyLockIconAfterUploadingLeaseDocument(self): time.sleep(2) self.isElementPresent(self.LockIcon()) # Deal in stage D-C ''' Preconditions User is logged into dealtrack User created/ finds a deal in stage D Create a new deal by clicking on the (+) on the bottom left side of the page, Add an address and Click Add, Click release to D (Add release estate manager, Desks, RSF, Est C release date, possession date and press submit) Step Expected Result 1 Go to Documents section of deal details page Next to Documents with orange caution icon it says 1 needed Under target tag Financial Model it says "Upload needed" with an orange caution icon 2 Click on the (+) under financial model and upload a proforma Financial model thumbnail says {"D to C release"}{Time: Just now} Under Financial model tag it says 'Ready for approval'' Next to 'Documents' section it says 'Ready for approval' 3 Click on "Release to C" Modal opens and Financial modal has the document that was added on the deal details page under Financial model 4 Enter "edit deal info" details (description, market and landlord) Add approvers and press submit Modal closes (approval buttons appear if you made yourself an approver) unable to go back and upload any required document, can still cancel release request ''' # test_04VerifyDocumentDealInStageDtoC text_ready_for_approval = "//div[@id='documents']/div/div/div/div/div[2]" def DocumentDealInStageDtoC(self): time.sleep(2) self.release.ReleaseEToD() self.release.AddFloors() self.Scroll_to_documents() time.sleep(2) self.dealdetail.FinacialDocuments() self.elementPresenceCheck(self.text_ready_for_approval, byType='xpath') self.release.ReleaseDToC() # test_05VerifyDocumentDealInStageCtoB def DocumentDealInStageCtoB(self): time.sleep(2) self.Scroll_to_documents() time.sleep(2) text_to_verify = self.getText(self.text_ready_for_approval) original_text = "4 needed" self.verifyTextContains(actualText=text_to_verify, expectedText=original_text) time.sleep(2) self.dealdetail.TermSheetDocument() self.dealdetail.FinacialDocuments() self.dealdetail.DealMemo() self.ClickNewFinancialModel() self.elementPresenceCheck(self.text_ready_for_approval, byType='xpath') time.sleep(2) self.release.ClickButtonReleaseToC() self.release.ReleaseProcessCtoBStep2() self.release.ReleaseCToB() self.release.ReleaseMoveToB() # test_06VerifyDocumentDealInStageBtoA def DocumentDealInStageBtoA(self): time.sleep(2) self.Scroll_to_documents() time.sleep(2) text_to_verify = self.getText(self.text_ready_for_approval) original_text = "4 needed" self.verifyTextContains(actualText=text_to_verify, expectedText=original_text) time.sleep(2) self.dealdetail.TermSheetDocument() self.dealdetail.FinacialDocuments() self.dealdetail.DealMemo() self.ClickNewFinancialModel() self.LeaseUpload() text_to_verify_after_uploading = self.getText(self.text_ready_for_approval) original_text_after_uploading = "Ready for approval" self.verifyTextContains(actualText=text_to_verify_after_uploading, expectedText=original_text_after_uploading) self.elementPresenceCheck(self.text_ready_for_approval, byType='xpath') time.sleep(2) # Request changes newly uploaded required doc is on thumbnail ''' Step 1 Press Request changes button Expected Result Request changes Modal appears 2 Select "What needs to change" and comment and press submit Expected Result Modal is closed and "Upload documents" cta appears 3 Click "Upload documents" and change the Financial model that is present with a different financial model and press submit Expected Result under documents, the most recent financial modal is in the thumbnail and on the thumbnail it states {"D to C release"}{Time: Just now} ''' uploaded_needed = "//strong[contains(text(),'Upload needed')]" close_icon_to_remove_file = "//img[@class='close']" check_text_after_uploading_the_document = "//span[text()='D to C release']" # test_07VerifyRequestChangesNewlyUploadedRequiredDocIsOnThumbnail def RequestChangesNewlyUploadedRequiredDocIsOnThumbnail(self): time.sleep(2) self.release.ReleaseEToD() self.release.AddFloors() self.release.ReleaseDToCForm() time.sleep(2) self.request.NoApprovalButtonsAfterRequestChanges() time.sleep(2) self.elementClick(self.request.update_document) time.sleep(2) self.elementClick(self.close_icon_to_remove_file) time.sleep(2) self.release.AddFileMemoSheet() time.sleep(30) self.request.RequestModalSubmitButton() time.sleep(2) self.Scroll_to_documents() time.sleep(2) actual_text = self.getText(self.check_text_after_uploading_the_document) expected_text = "D to C release" self.verifyTextContains(actualText=actual_text, expectedText=expected_text) # Canceling a release request ''' Preconditions User is logged into dealtrack User has a deal awaiting a release request approval User completed Steps: Click on the 'Cancel Release' CTA Expected : Release request is canceled and all the documents that were added for the release in the thumbnail displays: {Stage canceled}{name}{Time} Example: {D to C release Canceled}{Rumi Begum, 2days ago} ''' # test_08VerifyCancelingAReleaseRequest click_cancel_release_request_from_overflow_menu = "//p[contains(text(),'Cancel release request')]" text_release_canceled = "//span[contains(text(),'(Canceled)')]" def CancelingAReleaseRequest(self): time.sleep(2) self.dealdetail.ClickMenuIcon() time.sleep(2) self.elementClick(self.click_cancel_release_request_from_overflow_menu) time.sleep(2) self.dealdetail.SubmitButton() time.sleep(2) self.Scroll_to_documents() time.sleep(2) actual_text = self.getText(self.text_release_canceled) expected_text = "Canceled" self.verifyTextContains(actualText=actual_text, expectedText=expected_text)
def objectSetup(self, oneTimeSetUp): self.deal = DealList(self.driver)
def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.driver = driver
class RequestRevisionPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.driver = driver # C53688 Request revision button says "Request changes" ''' Preconditions User is logged in Steps Create or find a deal with release request when you are an approver Open deal details page Expected Result Reject button title is "Request changes" ''' select_d_to_c = "//div[5]/div/div/div[2]/div[3]/div/img" select_c_to_b = "//div[5]/div/div/div[2]/div[5]/div/img" select_b_to_a = "//div[5]/div/div/div[2]/div[7]/div/img" request_change_button = "//span[contains(text(),'Request changes')]" def SelectCtoB(self): self.elementClick(self.select_c_to_b) def SelectBToA(self): self.elementClick(self.select_b_to_a) # Verify request button available on the page # test_01VerifyRequestRevisionButtonDToC def VerifyRequestRevisionButtonAvailable(self): time.sleep(2) self.release.ReleaseEToD() self.release.AddFloors() self.release.ReleaseDToCForm() self.VerifyRequestButton() def VerifyRequestButton(self): button_text = self.getText(self.request_change_button) button_text1 = "Request changes" self.verifyTextContains(actualText=button_text, expectedText=button_text1) # C53690 No approval buttons after "Request changes" ''' Preconditions User is logged in Steps Create or find a deal with release request when you are an approver Open deal details page Click "Request changes" Fill in all of the fields in the modal Click submit Expected Result "Request changes" modal is dismissed Approval buttons ("Request changes" and "Approve release" should disappear) ''' click_select_a_change_drop_down = "//select[@name='reason']" select_incorrect_value = "//div[@id='app']/div/div[2]/div/div/div/div/div/div/label/div/select/option[2]" enter_comment = "//textarea[@placeholder='Enter a comment']" request_modal_submit_button = "//span[contains(text(),'Submit')]" # Click submit button of request modal pop up def RequestModalSubmitButton(self): self.elementClick(self.request_modal_submit_button) # Enter comment on request modal box def EnterComment(self, comment): self.elementClick(self.enter_comment) time.sleep(2) self.sendKeys(comment, self.enter_comment) # GLOBAL method to add comment def Comment(self): comment = "Request release changes" self.EnterComment(comment) # click on request change button def ClickRequestChangeModalButton(self): time.sleep(2) self.elementClick(self.request_change_button) ''' Steps: Create a new deal Process from e to d add floors verify request changes button click request change button select from drop down enter comment click submit verify upload button verify requested change text on approver at the bottom of the page scroll to upload document click upload document click add memo and upload pdf Click submit ''' doc_upload_button = "//div[@id='app']/div/div/div[2]/div/div[2]/div/div/div/div/div[3]/button/span" cancel_button = "//p[contains(text(),'Cancel release request')]" update_document = "//span[contains(text(),'Update documents')]" def ClickDealDetailPageCancelButton(self): self.dealdetail.ClickMenuIcon() time.sleep(2) self.elementClick(self.cancel_button) self.dealdetail.SubmitButton() # test_02VerifyNoApprovalButtonsAfterRequestChanges def NoApprovalButtonsAfterRequestChanges(self): time.sleep(2) self.ClickRequestChangeModalButton() time.sleep(2) self.elementClick(self.select_incorrect_value) time.sleep(2) self.Comment() time.sleep(2) self.RequestModalSubmitButton() time.sleep(4) get_button = self.getText(self.update_document) text = "Update documents" self.verifyTextContains(actualText=get_button, expectedText=text) # CTA button should say "Upload documents" ''' Preconditions User should be logged in Steps Find a deal that you have requested changes on Expected Result In the header area to the right of the approval progress bar there should be two buttons floated to the right: 1. "Cancel release" 2. "Upload documents" ''' # test_04VerifyCTAButtonShouldSayUploadDocuments def CTAButtonShouldSayUploadDocuments(self): time.sleep(2) get_button = self.getText(self.update_document) text = "Update documents" self.verifyTextContains(actualText=get_button, expectedText=text) # C53691 Approver section updates to reflect "Requested changes" status ''' Preconditions User is logged in Steps Create or find a deal with release request when you are an approver Open deal details page Click "Request changes" Fill in all of the fields in the modal Click submit Expected Result Look for your name in the Approvers section To the right of your name it should read in yellow text: "(Requested changes)" ''' requested_changes_on_deal_detail_page = "//span[contains(text(),'Requested changes')]" submit_button = "//span[contains(text(),'Submit')]" # test_05VerifyApproverSectionUpdatesToReflectRequestedChangesStatus def ApproverSectionUpdatesToReflectRequestedChangesStatus(self): time.sleep(2) #self.dealdetail.innerScroll(self.dealdetail.scroll_to_team) approver_request_text = self.getText( self.requested_changes_on_deal_detail_page) text = "Requested changes" self.verifyTextContains(actualText=approver_request_text, expectedText=text) # test_06VerifyRequestRevisionFromDToC def VerifyRequestRevisionFromDToC(self): time.sleep(2) # self.dealdetail.innerScrollUp(self.doc_upload_button) # time.sleep(2) self.elementClick(self.update_document) time.sleep(2) self.release.AddDealMemo() time.sleep(2) self.RequestModalSubmitButton() time.sleep(2) self.VerifyRequestButton() time.sleep(2) self.release.ApproveReleaseButtonClick() ''' Click release to b button Enter all the detail on the form Click submit on step 3 Expected Verify request change button Click request change button Select value from drop down Enter comment Click submit Expected: Verify request button should not be shown now Scroll to the bottom of the page Expected: VERIFY Requested change text just near the approver name Scroll the screen to top Click on upload documenmt Upload the deal memo document again Click submit ''' def VerifyNoApprovalButtonsAfterRequestChangesFromCtoB(self): self.release.ReleaseProcessCTOB() time.sleep(2) self.dealdetail.SubmitButton() self.release.AddMeetingNote() time.sleep(4) self.NoApprovalButtonsAfterRequestChanges() def ApproverSectionUpdatesToReflectRequestedChangesStatusFromCToB(self): time.sleep(2) self.ApproverSectionUpdatesToReflectRequestedChangesStatus() click_first_close_icon = "//div[@id='app']/div/div[2]/div/div/div/div/div/div[2]/div/div[1]/div/img" def VerifyRequestRevisionFromCToB(self): time.sleep(2) # self.dealdetail.innerScrollUp(self.doc_upload_button) # time.sleep(2) self.elementClick(self.doc_upload_button) time.sleep(2) self.elementClick(self.click_first_close_icon) time.sleep(2) self.release.AddDealMemo() time.sleep(2) self.RequestModalSubmitButton() time.sleep(2) self.VerifyRequestButton() # C53692 Deal list filter type "Needs my approval" list does not include deals where I have request changes ''' Preconditions User is logged in Steps Find a deal that has changes requested Click "Update documents" (only if you are part of the deal team should you see update document) The submit button should be disabled. Click the X next to one of the file tokens to remove it Add a new file by clicking on the "Add file" button Once a new document is added, noticed the submit button is enabled Click submit Expected Result The new document should appear on the deal details page IF you are an approver on the deal, approval buttons should be visible again ''' def ApprovalButtonsReturnAfterUpdatingDocumentsAfterChangesAreRequested( self): time.sleep(3) approve_button = self.getText(self.release.approve_release_button) approve_button_text = "Approve release" self.verifyTextContains(actualText=approve_button, expectedText=approve_button_text) time.sleep(3) self.release.ApproveReleaseButtonClick() ''' Click button release to a Ente all the details and click submit Expected: Verify request button should be there Click requested button Enter comment and select value from drop down Click submit Scroll to bottom of screen Expected: Verify approver text at the bottom of the screen. Scroll to the top and click on upload document Upload deal memo doc Click submit ''' def VerifyNoApprovalButtonsAfterRequestChangesFromBtoA(self): self.release.ReleaseMoveToB() self.release.ReleasePopUpFieldEntry() time.sleep(2) self.dealdetail.SubmitButton() time.sleep(2) self.NoApprovalButtonsAfterRequestChanges() def ApproverSectionUpdatesToReflectRequestedChangesStatusFromBToA(self): time.sleep(2) self.ApproverSectionUpdatesToReflectRequestedChangesStatus() click_first_close_from_b_to_c = "//div[@id='app']/div/div[2]/div/div/div/div/div/div[3]/div/div[1]/div/img" def VerifyRequestRevisionFromBToA(self): time.sleep(2) # self.dealdetail.innerScrollUp(self.doc_upload_button) # time.sleep(2) self.elementClick(self.doc_upload_button) time.sleep(2) self.elementClick(self.click_first_close_icon) time.sleep(2) self.release.AddDealMemo() time.sleep(2) self.RequestModalSubmitButton() time.sleep(2) self.VerifyRequestButton() self.release.ApproveReleaseButtonClick() # C53692 Deal list filter type "Needs my approval" list does not include deals where I have request changes ''' Preconditions User has logged in Steps Create or find deal that needs your approval Navigate to deal from “Needs my approval” Click "Request changes" Navigate back to “Needs my approval” Expected Result The deal should not appear in the "Needs my approval" deal list ''' # change deal name deal_name_change = "//input[@placeholder='Unknown']" def ChangeDealName(self, dealname): time.sleep(2) self.elementClick(self.deal_name_change) time.sleep(2) self.clearField(self.deal_name_change) self.sendKeys(dealname, self.deal_name_change) # Enter deal name def EnterDealName(self): time.sleep(2) dealname = "#" self.ChangeDealName(dealname) more_filter = ".sidebar--header-icon:nth-child(4)" search_textbox = "//input[@placeholder='Search for deals']" no_deal_found = "//h3[contains(text(),'No deals matching your filters')]" def EnterSearchTextBox(self, name): self.elementClick(self.search_textbox) time.sleep(2) self.sendKeys(name, self.search_textbox) def PressEnter(self, value): self.sendKeys(value, self.search_textbox) def DealRemovedFromNeedMyApprovalAfterRequestChanges(self): time.sleep(3) self.elementClick(self.deal.click_need_my_approval) time.sleep(2) self.EnterDealName() time.sleep(2) self.NoApprovalButtonsAfterRequestChanges() time.sleep(2) self.deal.ClickBackArrow() time.sleep(4) self.elementClick(self.deal.click_need_my_approval) time.sleep(2) name = "#" self.EnterSearchTextBox(name) time.sleep(2) self.PressEnter(Keys.ENTER) time.sleep(2) no_deal_text = self.getText(self.no_deal_found) deal_text = "No deals matching your filters" self.verifyTextContains(actualText=no_deal_text, expectedText=deal_text)
class KeyChangesPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.unrelease = UnReleasePages(self.driver) self.release = ReleasePage(self.driver) self.driver = driver # Key changes chart does not show on deals with no previous data ''' Preconditions User is logged in to dealtrack Steps Click on the (+) on the bottom left of the page to add a new deal Enter a new address Click Add Go to the deal details page of deal added Expected Result Above the “Ganeral Info” & below Timeline section of the deal details page, there should be no mention of “Key changes” Note : This section will be displayed once deal is released to stage D & floors been added ''' scroll_to_financial = "//a[contains(text(),'Financials')]" key_changes_text = "//span[contains(text(),'Key changes since release')]" def ClickFinancialTab(self): self.elementClick(self.scroll_to_financial) def VerifyKeyChangesChartDoesNotShowOnDealsWithNoPreviousData(self): time.sleep(2) self.deal.AddNewDeal() time.sleep(2) self.ClickFinancialTab() time.sleep(2) if not self.isElementDisplayed(self.key_changes_text): self.log.info('Pass') assert True else: self.log.info('Fail') assert False # Key changes chart only shows values that have changed ''' Preconditions User is logged in to dealtrack User created a deal in E:(https://wework.testrail.net/index.php?/cases/view/58647&group_by=cases:section_id&group_id=6586&group_order=asc ) Steps Navigate to the deal created Click 'Release to D' CTA button In Modal add a Real estate manager Enter Desks and RSF values and select Est. C release and Possession date (remember RSF and Desk values) Press submit Observe: note there is no Key changes section! Click 'Add floors' CTA in 'Add floors' text box add '1' and press enter on keyboard In RSF add a different value than previously added in release to D modal, add USF value, add a different Desks value than previously added in release to D modal Add Possession and Opening dates Press save Expected Result On deal details page under description there is a Key changes since release section with a drop down stating the most recent stage (Stage D (Sourcing)) (this example will not have any other options in dropdown) Within chart you will see 4 columns: Data point column (Desks, RSF), Stage 'D ' (will change depending on stage, column contains the original value in that particular stage), Now (the changed value), Change (if it has Increased with a upward arrow icon in front, Decreased with a downward arrow in front, Added or Removed) Key Changes will have data points Desk RSF ''' desk_text = "//strong[contains(text(),'Desks')]" rsf_text = "//strong[contains(text(),'RSF')]" now_text = "//p[contains(text(),'Now')]" change_text = "//p[contains(text(),'Change')]" def VerifyKeyChangesChartOnlyShowsValuesThatHaveChanged(self): time.sleep(2) self.release.ReleaseEToD() self.release.AddFloors() self.isElementDisplayed(self.key_changes_text) self.isElementPresent(self.desk_text) self.isElementPresent(self.rsf_text) self.isElementPresent(self.now_text) self.isElementPresent(self.change_text) increase_decrease_change = ".sc-1c6ibka-0:nth-child(2) > .key-changes--change-column > .Mono-sc-1pt1tnu" def CheckChangeInText(self): self.getText(self.increase_decrease_change, locatorType='css') def VerifyChangeColumnVariation(self): time.sleep(2) actual_text = self.getText(self.increase_decrease_change, locatorType='css') expected_text = "Decreased" self.verifyTextContains(actualText=actual_text, expectedText=expected_text) # Change column signifies change in data D-C ''' Preconditions User is logged in to Dealtrack Page must be viewed with browser in full screen User has created a deal that has Key changes section: in Stage D (https://wework.testrail.net/index.php?/cases/view/58648&group_by=cases:section_id&group_id=6586&group_order=asc ) Steps: Click Release to C Expected Release to C modal appears 2 Upload Financial Model Update required deal info and add approvers Press submit Expected Release is submitted and modal is closed, once FiMo is done scrapping observe 'Key changes since release' has data points: -RSF -USF/desk -Gross construction cost -EBITDA -Payback -IRR 3 Observe 'Stage D' column has '-' and 'Now' column has the value scrapped from Financial Model Expected 'Now' column should display scraped values from Financial Model for data points with any changes: -Rent -Desks -RSF -USF/desk -Gross construction cost -EBITDA -Payback -IRR 4 The column on the far right of the key changes chart should be labeled “Change” Expected Change with display if the change has increased, decreased, added or removed ''' usf_desk = "//strong[contains(text(),'USF/desk')]" gross_construction_cost = "//strong[contains(text(),'Gross construction cost')]" ebitda = "//strong[contains(text(),'EBITDA')]" payback = "//strong[contains(text(),'Payback')]" irr = "//strong[contains(text(),'IRR')]" def VerifyDataChangeAfterReleasingDtoC(self): self.release.ReleaseDToCForm() time.sleep(2) self.ClickFinancialTab() time.sleep(2) self.isElementPresent(self.usf_desk) self.isElementPresent(self.gross_construction_cost) self.isElementPresent(self.ebitda) self.isElementPresent(self.payback) self.isElementPresent(self.irr) change_value = "//div[@id='financials']//div[2]/div[2]/div[1]" def VerifyChangesInChangeColumn(self): time.sleep(2) actual_text = self.getText(self.increase_decrease_change, locatorType='css') expected_text = "added" self.verifyTextContains(actualText=actual_text, expectedText=expected_text) def ChangeColumnSignifiesChangeInDataCToB(self): time.sleep(2) self.release.ReleaseProcessCTOB() time.sleep(2)
class UnReleasePages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deal = DealList(self.driver) self.dealdetail = DealDetailScreenPages(self.driver) self.release = ReleasePage(self.driver) self.driver = driver # C27844 Unrelease D>E ''' Preconditions User should be on deal details screen having stage D Steps 1.Click on More icon "..." displayed on top-right corner of the screen 2.Click on Move back to E(Discovery) button from modal box 3.Click on Submit button from confirmation box ''' select_sourcing = "//div[5]/div/div/div[2]/div[2]/div/img" select_term_sheet = "//div[5]/div/div/div[2]/div[4]/div/img" select_c_to_b = "//div[5]/div/div/div[2]/div[5]/div/img" select_leasing = "//div[5]/div/div/div[2]/div[6]/div/img" click_move_back_to_E = "//p[contains(text(),'Move back to ')]" reset_button = "//button[contains(text(),'Reset')]" select_lease_signed = "//div[5]/div/div/div[2]/div[8]/div/img" def ClickResetButton(self): time.sleep(2) self.elementClick(self.reset_button) def SelectSourcing(self): time.sleep(2) self.elementClick(self.select_sourcing) def GlobalFilterSelection(self): self.deal.MoreFilterIcon() self.ClickResetButton() time.sleep(2) self.deal.ClickStageField() def ClickMenuIcon(self): self.deal.ClickApplyButton() time.sleep(2) self.dealdetail.ClickMenuIcon() time.sleep(3) self.elementClick(self.click_move_back_to_E) time.sleep(3) self.dealdetail.SubmitButton() def UnreleaseDTOE(self): self.deal.ClickBackArrow() time.sleep(2) self.GlobalFilterSelection() time.sleep(2) self.elementClick(self.select_sourcing) time.sleep(2) self.ClickMenuIcon() time.sleep(3) text = self.getText(self.release.release_to_d_button) button_text = "Release to D" self.verifyTextContains(actualText=text, expectedText=button_text) # C27845 Unrelease C>D ''' Preconditions User should be on deal details screen having stage C Steps 1.Click on More icon "..." displayed on top-right corner of the screen 2.Click on Move back to D(Sourcing) button from modal box 3.Click on Submit button from confirmation box Expected Result Deal should get unreleased from stage C to D & an Email should be sent to all the deal team members ''' # def PressBackArrow(self, key): # self.elementClick(self.deal.ClickStageField()) # time.sleep(2) # self.sendKeys(key, self.deal.ClickStageField()) def ClickReset(self): self.elementClick(self.reset_button) def UnReleaseCTOD(self): self.GlobalFilterSelection() time.sleep(2) self.elementClick(self.select_term_sheet) time.sleep(2) self.deal.ClickApplyButton() time.sleep(2) self.ClickMenuIcon() time.sleep(4) text = self.getText(self.release.button_request_release_to_c) button_text = "Request release" self.verifyTextContains(actualText=text, expectedText=button_text) # C27846 Unrelease B>C ''' Preconditions User should be on deal details screen having stage B Steps 1.Click on More icon "..." displayed on top-right corner of the screen 2.Click on Move back to C(Term Sheet) button from modal box 3.Click on Submit button from confirmation box Expected Result Deal should get unreleased from stage B to C & an Email should be sent to all the deal team members ''' def UnReleaseBTOC(self): time.sleep(2) self.GlobalFilterSelection() time.sleep(2) self.elementClick(self.select_leasing) time.sleep(2) self.deal.ClickApplyButton() time.sleep(2) self.ClickMenuIcon() time.sleep(4) text = self.getText(self.release.button_request_release_to_b) button_text = "Request release" self.verifyTextContains(actualText=text, expectedText=button_text) # C27847 Unrelease A>B ''' Preconditions User should be on deal details screen having stage A Steps 1.Click on More icon "..." displayed on top-right corner of the screen 2.Click on Move back to B(Leasing) button from modal box 3.Click on Submit button from confirmation box Expected Result Deal should get unreleased from stage A to B & an Email should be sent to all the deal team members ''' button_release_to_a = "//span[contains(text(),'Request release')]" def UnReleaseATOB(self): time.sleep(2) self.GlobalFilterSelection() time.sleep(2) self.elementClick(self.select_lease_signed) time.sleep(2) self.deal.ClickApplyButton() time.sleep(2) self.ClickMenuIcon() time.sleep(4) text = self.getText(self.button_release_to_a) button_text = "Request release" self.verifyTextContains(actualText=text, expectedText=button_text) # C39536 Budget as new required doc while releasing B-A ''' Preconditions User should be logged into the app Steps "Additional required document to be uploaded" 1.Click on any deal having stage B 2.Click on Release to stage A button Expected : 1.Request release B-> A modal box should get invoked & new optional document field as "Budget" should be displayed on it 2.Document should have a optional tag near it 3.Document should in excel format 4.It should be displayed in the same way the other release documents do ''' add_budget_file = "//div[5]//p[2]//a[1]" optional_tag = "//p[contains(text(),'optional')]" verify_added_file = "//p[contains(text(),'1 file added')]" verify_error_msg = "//div[@id='__filestack-picker']/div/div[2]/div" upload_pop_up_close = ".fsp-picker__close-button" def AddBudgetFile(self): self.elementClick(self.add_budget_file) time.sleep(2) def BudgetAsNewRequiredDocWhileReleasingBToA(self): time.sleep(2) self.GlobalFilterSelection() time.sleep(2) self.elementClick(self.select_leasing) time.sleep(2) self.deal.ClickApplyButton() time.sleep(2) self.elementClick(self.button_release_to_a) time.sleep(3) self.AddBudgetFile() doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/v4.2_Proforma(1).xlsb" self.dealdetail.UploadDocuments(doc) time.sleep(45) text = self.getText(self.verify_added_file) original_text = "1 file added; 4 remaining" self.verifyTextContains(actualText=text, expectedText=original_text) # upload the document and click on cancel button cancel_button_on_popup = "//button[contains(text(),'Cancel')]" def VerifyByUploadRequiredDocAndCancelTheProcess(self): time.sleep(2) self.elementClick(self.cancel_button_on_popup) time.sleep(2) text = self.getText(self.button_release_to_a) button_text = "Request release" self.verifyTextContains(actualText=text, expectedText=button_text) # upload invalid documents and verify the error message. def BudgetAsNewRequiredDocWhileReleasingBToA_VerifyInvalidFileUpload(self): time.sleep(2) self.elementClick(self.button_release_to_a) time.sleep(2) self.AddBudgetFile() doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/1.pdf" self.dealdetail.UploadDocuments(doc) time.sleep(2) text = self.getText(self.verify_error_msg) error_text = "File 1.pdf is not an accepted file type. The accepted file types are .xls,.xlsx,.xlsm,.xlsb" self.verifyTextContains(actualText=text, expectedText=error_text) # C54649 Lease document validation ''' Preconditions User should be logged in Steps "Uploading lease document informs user of access control" 1.Find or create deal that is stage B 2.Create release request 3.When uploading documents begin to upload lease Expected Result There exists text that informs the user that lease documents will not be viewable on Dealtrack after submission ''' lease_text = "//div[@id='app']/div/div/div[2]/div/div[2]/div/div/div[9]/div[2]/div[4]/div[2]/span" lock_icon = ".Regular-sc-ju30to svg" lease_text_on_popup = "//p[contains(text(),'will not be accessible from application')]" def VerifyLeaseTextOnPopUp(self): time.sleep(2) self.elementClick(self.upload_pop_up_close, locatorType='css') time.sleep(2) text = self.getText(self.lease_text_on_popup) text_to_verify = "will not be accessible from application" self.verifyTextContains(actualText=text, expectedText=text_to_verify) ''' "Lease document from cancelled release request is not viewable" 1.Find or create deal in stage B 2.Create release request to A 3.Add approvers and upload documents 4.Cancel release request Expected : Lease approval document has moved to "Attachments" section but is dimmed and locked Clicking on document does nothing ''' scroll_to_documents = "//a[contains(text(),'Documents')]" def VerifyLeaseAttachementByClickingLeaseDocument(self): time.sleep(2) self.elementClick(self.cancel_button_on_popup) time.sleep(2) self.release.ReleasePopUpFieldEntry() time.sleep(2) self.dealdetail.SubmitButton() time.sleep(3) self.elementClick(self.scroll_to_documents) time.sleep(2) self.elementClick(self.lock_icon, locatorType='css') time.sleep(2) financial_text = self.getText(self.scroll_to_documents) text = 'Documents' self.verifyTextContains(actualText=text, expectedText=financial_text) # C54915 Global approvers do not exist on C>B deals ''' Preconditions Log in to dealtrack Steps: "On C>B deals, global approvers section shows copy instead of approvers list" Navigate to deal in C>B stage Expected : Under approvers section, “Global approvers” bucket should not have any users listed out and should read “Global Approvers are not required for C>B deals” Regional approvers should be listed as normal ''' global_approver_c_to_b = "//p[contains(text(),'Global Approvers are not required for C>B deals')]"
class DealDetailScreenPages(SeleniumDriver): def __init__(self, driver): super().__init__(driver) self.deall = DealList(self.driver) self.driver = driver # Locators: # C27833 Deal details ''' Preconditions User should be logged into the app Steps 1.Create a new deal 2.Click on newly created deal Expected Result User should redirect to deal details screen ''' def DealDetails(self): time.sleep(2) self.deall.AddNewDeal() # C27834 Deal details adding/editing pictures, description, dealteam members, comments ''' Preconditions User should be on deal details screen Steps 1.Click on New Photo button link on each tag section 2.Add some photos 3.Click on description field 4.Enter some description related to deal 5.Click on each (+)link tag section under Document field 6.Add few attachments 7.Click on deal team field 8.Add 5 deal team members Expected Result Data should get reflected on deal details screen for all the fields mentioned ''' click_new_photo = "//span[contains(text(),'New photo')]" click_upload_popup = "//input[@id='fsp-fileUpload']" click_upload_button = "//span[contains(text(),'Upload')]" click_uploaded_image = '.tag > img' check_after_photo_upload = "//span[contains(text(),'Photos')]" click_close_icon = "//img[@alt='Close']" # Created a function to upload the documents. def UploadDocuments(self, name): self.getElement(self.click_upload_popup) self.sendKeys(name, self.click_upload_popup) def ClickUploadButton(self): self.elementClick(self.click_upload_button) def ClickPhotoModalCloseIcon(self): self.elementClick(self.click_close_icon) def ClickUploadedImage(self): self.elementClick(self.click_uploaded_image, locatorType='css') def AddPhotos(self, name=''): time.sleep(2) self.elementClick(self.click_new_photo) time.sleep(2) # self.driver.switch_to.frame(0) name = "C:/Users/Sagar/PycharmProjects/DealTrack/images/R0010005.JPG" self.UploadDocuments(name) time.sleep(4) self.ClickUploadButton() time.sleep(35) self.VerifyPhotoAddedSuccessfully() def VerifyPhotoAddedSuccessfully(self): upload_text = "Photos" self.ClickUploadedImage() time.sleep(2) get_upload_text = self.getText(self.check_after_photo_upload) self.verifyTextContains(actualText=get_upload_text, expectedText=upload_text) time.sleep(2) self.ClickPhotoModalCloseIcon() click_description = "//span[contains(text(),'Description')]" enter_description = "//textarea[@name='description']" click_Save_button = "//button[contains(.,'Save')]" description_text = "//span[contains(.,'Hi this is a random automation text')]" def EnterDesc(self, description): self.elementClick(self.enter_description) self.clearField(self.enter_description) self.sendKeys(description, self.enter_description) def Description(self): time.sleep(2) self.elementClick(self.click_description) time.sleep(2) text_desc = "Hi this is a random automation text" self.EnterDesc(text_desc) time.sleep(2) self.elementClick(self.click_Save_button) time.sleep(2) # self.elementClick(self.click_description) # time.sleep(2) # desc_value = self.getElement(self.enter_description).get_attribute('value') time.sleep(2) desc_value = self.getText(self.description_text) self.verifyTextContains(actualText=desc_value, expectedText=text_desc) time.sleep(2) self.elementClick(self.click_Save_button) # Steps for Financial, term sheet and demo ''' 1. Login to app 2. After entering description scroll the screen to documents section 3. Click on financial model 4. Upload the documents 5. Now click on term and similarly deal memo 6. Upload the documents. ''' click_financial = ".h4p14a-0:nth-child(1) svg" click_deal_memo = "//div[@id='documents']/div[2]/div[4]/div[2]/div" click_term_sheet = "//div[@id='documents']/div[2]/div[3]/div[2]/div" scroll_to_text = "//span[contains(text(),'Documents')]" text_after_upload_financial_pdf = "//span[contains(text(),'E (Discovery)')]" click_reason_dropdown = "//select[@name='proformaUploadReason']" select_option_from_dropdown = "//div[@id='app']/div/div[2]/div/div/div/div[2]/div/label/div/select/option[2]" click_upload_file_button = "//span[contains(text(),'Upload file (.xlsb)')]" def FinacialDocuments(self): time.sleep(15) self.innerScroll(self.scroll_to_text) time.sleep(2) self.elementClick(self.click_financial, locatorType='css') time.sleep(2) self.UploadFinanciaDocumentUsingNewPopUp() # text = 'E (Discovery)' # text_after_upload = self.getText(self.text_after_upload_financial_pdf) # self.verifyTextContains(actualText=text_after_upload, expectedText=text) def UploadFinanciaDocumentUsingNewPopUp(self): self.elementClick(self.click_reason_dropdown) time.sleep(2) self.elementClick(self.select_option_from_dropdown) time.sleep(2) self.elementClick(self.click_upload_file_button) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/v4.2_Proforma(1).xlsb" self.UploadDocuments(doc) time.sleep(45) self.elementClick(self.click_Save_button) def TermSheetDocument(self): time.sleep(2) self.elementClick(self.click_term_sheet) time.sleep(2) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/1.pdf" self.UploadDocuments(doc) time.sleep(15) def DealMemo(self): time.sleep(2) self.elementClick(self.click_deal_memo) time.sleep(2) doc = "C:/Users/Sagar/PycharmProjects/DealTrack/files/DealMemo.pdf" self.UploadDocuments(doc) time.sleep(15) # Steps for team section ''' Test case: 1. login to app 2. Scroll to team section on deal detail screen 3. Click on team 4. Enter value 5. Click save button 6. Click on team 7. Get value of last entered value Verify entered values matches with the field. ''' scroll_to_team = "//h4[contains(text(),'Team')]" enter_real_state_manager = "//div[@id='app']/div/div[2]/div[1]/div/div/div/div/div/div/div/div[1]/div/div/input" select_real_state_manager_value = "//li[contains(.,'Shazadi Mohammed')]" click_team_save_button = "//button[contains(text(),'Save')]" def SaveButton(self): self.elementClick(self.click_team_save_button) def EnterRealManager(self, name): self.elementClick(self.enter_real_state_manager) time.sleep(2) self.clearField(self.enter_real_state_manager) time.sleep(2) self.sendKeys(name, self.enter_real_state_manager) def SelectRealStateManagerValue(self): name = "Shazadi Mohammed" self.EnterRealManager(name) time.sleep(2) self.elementClick(self.select_real_state_manager_value) def TeamMemberRealStateManager(self): time.sleep(2) self.innerScroll(self.scroll_to_team) time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) name = "Shazadi Mohammed" self.SelectRealStateManagerValue() self.elementClick(self.click_team_save_button) time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) real_state = self.getElement( self.enter_real_state_manager).get_attribute('value') time.sleep(2) self.verifyTextContains(actualText=real_state, expectedText=name) enter_transaction_manager = "//div[2]/div/div/input" select_transaction_manager_value = "//li[contains(.,'Shazadi Mohammed')]" def EnterTransactionManager(self, name): self.elementClick(self.enter_transaction_manager) time.sleep(2) self.sendKeys(name, self.enter_transaction_manager) def SelectTransactionManager(self): name = "Shazadi Mohammed" self.EnterTransactionManager(name) time.sleep(3) self.elementClick(self.select_transaction_manager_value) time.sleep(2) def TransactionManger(self): time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) name = "Shazadi Mohammed" self.SelectTransactionManager() self.elementClick(self.click_team_save_button) time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) transaction_manager = self.getElement( self.enter_transaction_manager).get_attribute('value') time.sleep(2) self.verifyTextContains(actualText=transaction_manager, expectedText=name) enter_sourcer = "//div[3]/div/div/input" select_sourcer_value = "//li[contains(.,'Shazadi Mohammed')]" def EnterSourcer(self, name): self.elementClick(self.enter_sourcer) time.sleep(2) self.clearField(self.enter_sourcer) time.sleep(2) self.sendKeys(name, self.enter_sourcer) def SelectSourcer(self): name = 'Shazadi Mohammed' self.EnterSourcer(name) time.sleep(3) self.elementClick(self.select_sourcer_value) time.sleep(2) def Sourcer(self): time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) name = 'Shazadi Mohammed' self.SelectSourcer() self.elementClick(self.click_team_save_button) time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(3) sourcer = self.getElement(self.enter_sourcer).get_attribute('value') time.sleep(2) self.verifyTextContains(actualText=sourcer, expectedText=name) enter_real_state_analyst = "//div[3]/div/div/input" select_real_state_analyst_value = "//li[contains(.,'Shazadi Mohammed')]" def EnterRealState(self, name): self.elementClick(self.enter_real_state_analyst) time.sleep(2) self.sendKeys(name, self.enter_real_state_analyst) def SelectRealStateAnalystValue(self): name = 'Shazadi Mohammed' self.EnterRealState(name) time.sleep(3) self.elementClick(self.select_real_state_analyst_value) time.sleep(2) def RealStateAnalyst(self): time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) name = 'Shazadi Mohammed' self.SelectRealStateAnalystValue() self.elementClick(self.click_team_save_button) time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) real_state = self.getElement( self.enter_real_state_analyst).get_attribute('value') time.sleep(2) self.verifyTextContains(actualText=real_state, expectedText=name) self.elementClick(self.click_team_save_button) # Locators for internal counsels enter_internal_counsel = "//div[5]/div/div/input" select_internal_counsel_value = "//li[contains(.,'Shazadi Mohammed')]" # Method to enter value in the text field def EnterInternalCounsel(self, name): self.elementClick(self.enter_internal_counsel) time.sleep(2) self.sendKeys(name, self.enter_internal_counsel) # Entering and selecting the value from the suggestion list def SelectInternalCounsel(self): name = 'Shazadi Mohammed' self.EnterInternalCounsel(name) time.sleep(3) self.elementClick(self.select_internal_counsel_value) time.sleep(2) # Method to save the value and verify the selection matches and showing correctly on the team screen. def InternalCounsel(self): time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) name = 'Shazadi Mohammed' self.SelectInternalCounsel() self.elementClick(self.click_team_save_button) time.sleep(2) self.elementClick(self.scroll_to_team) time.sleep(2) internal_counsel = self.getElement( self.enter_internal_counsel).get_attribute('value') time.sleep(2) self.verifyTextContains(actualText=internal_counsel, expectedText=name) # C27836 Deal details adding/editing data for Genaral Info, Terms, Performance & Floors tab ''' Preconditions User should be on deal details screen Steps 1.Click on General Info tab 2.Add values in Market, product type (adding, removing multiple product types), Desks, USF, RSF, Possession, Opening & Tour completed fields 3.Click on Save button 4.Click on Terms tab 5.Add values in Dealtype, Gross rent, Net rent, OpEx, TI allowance, Free rent, Lease term & Signage fields 6.Click on Save button 7.Click on Performance tab 8.Add values in EBITDA margin, Breakeven occupancy, payback period, Net effective rent, Gross NPV, Adjusted NPV, Annual escalations, Loss factor, Effect on capEx, Effect on desk goals, Letter of creditY1, Corporate Guarantee fields 9.Click on Save button 10.Click on Floors tab 11.Click on Add floors link 12.Type floor number and hit Enter 13.Add values in all subfields 14.Click on Save button Expected Result Data should get reflected on deal details screen for all the fields mentioned ''' scroll_to_general_tab = "//div[contains(text(),'General')]" click_to_open_general_tab = "//span[contains(text(),'Desks')]" enter_desk_value = "//input[@name='desks']" enter_usf_value = "//input[@name='usf']" enter_rsf_value = "//input[@name='rsf']" click_yes = "//label/p[contains(text(),'Yes')]" check_desk = "//li[4]//span[2]" check_usf = "//li[5]//span[2]" check_rsf = "//li[6]//span[2]" check_tour_completed = "//li[9]//span[2]" def CheckLabelYes(self): self.elementClick(self.click_yes) def EnterDeskValue(self, num): self.elementClick(self.enter_desk_value) time.sleep(1) self.sendKeys(num, self.enter_desk_value) def EnterUSFValue(self, usfnum): self.elementClick(self.enter_usf_value) time.sleep(1) self.sendKeys(usfnum, self.enter_usf_value) def EnterRSFValue(self, rsfnum): self.elementClick(self.enter_rsf_value) time.sleep(1) self.sendKeys(rsfnum, self.enter_rsf_value) def GeneralInfoTab(self): time.sleep(2) self.innerScrollUp(self.scroll_to_general_tab) time.sleep(2) self.elementClick(self.click_to_open_general_tab) time.sleep(2) num = '100' self.EnterDeskValue(num) time.sleep(2) usfnum = '100' self.EnterUSFValue(usfnum) time.sleep(2) rsfnum = '100' self.EnterRSFValue(rsfnum) time.sleep(2) self.innerScroll(self.click_yes) time.sleep(2) self.CheckLabelYes() time.sleep(2) self.elementClick(self.click_Save_button) time.sleep(2) desk_name = self.getText(self.check_desk) # desk_name = desk_name.split() # desk_name = desk_name[1] time.sleep(2) rsfname = self.getText(self.check_rsf) # rsfname = rsfname.split() # rsfname = rsfname[1] time.sleep(2) usfname = self.getText(self.check_usf) # usfname = usfname.split() # usfname = usfname[1] time.sleep(2) self.verifyTextContains(actualText=desk_name, expectedText=num) self.verifyTextContains(actualText=usfname, expectedText=usfnum) self.verifyTextContains(actualText=rsfname, expectedText=rsfnum) click_terms_tab = "//div[contains(text(),'Terms')]" click_to_open_terms_tab = "//span[contains(text(),'Gross')]" click_rental_type_dropdown = "//select[@name='rentType']" click_rfi_lease = "//option[@value='FRI']" enter_gross_rent = "//input[@name='grossRentPerMonthNotes']" enter_opEx = "//input[@name='opEx']" enter_allowance = "//input[@name='tiAllowanceNotes']" enter_free_rent = "//input[@name='freeRentMonthsNotes']" enter_lease_term = "//input[@name='termMonthsNotes']" check_gross_rent = "//li[3]//span[2]" check_rfi_lease = "//li[3]//span[2]" check_opEx = "//li[4]//span[2]" check_allowance = "//li[5]//span[2]" check_free_rent = "//li[6]//span[2]" check_lease_term = "//li[7]//span[2]" check_signange = "//li[8]//span[2]" Click_product_type = "//div[@id='app']/div/div[2]/div/div/div/div/form/div/div[2]/div/div/div/div/input" select_product = "//div[2]/div/div/div/div[2]/div[2]/div/p" def EnterGrossRent(self, gross_rent): self.elementClick(self.enter_gross_rent) time.sleep(1) self.sendKeys(gross_rent, self.enter_gross_rent) def EnterOpEx(self, op_ex): self.elementClick(self.enter_opEx) time.sleep(1) self.sendKeys(op_ex, self.enter_opEx) def EnterAllowances(self, allow): self.elementClick(self.enter_allowance) time.sleep(1) self.sendKeys(allow, self.enter_allowance) def EnterFreeRent(self, rent): self.elementClick(self.enter_free_rent) time.sleep(1) self.sendKeys(rent, self.enter_free_rent) def EnterLeaseTerm(self, lease): self.elementClick(self.enter_lease_term) time.sleep(1) self.sendKeys(lease, self.enter_lease_term) def TermsTab(self): time.sleep(2) self.elementClick(self.click_terms_tab) time.sleep(2) self.elementClick(self.click_to_open_terms_tab) time.sleep(2) self.elementClick(self.Click_product_type) time.sleep(2) self.elementClick(self.select_product) time.sleep(2) self.elementClick(self.click_rental_type_dropdown) time.sleep(2) self.elementClick(self.click_rfi_lease) time.sleep(2) gross_rent = '300' self.EnterGrossRent(gross_rent) time.sleep(2) op_ex = "400" self.EnterOpEx(op_ex) time.sleep(2) allow = "400" self.EnterAllowances(allow) time.sleep(2) self.innerScroll(self.click_yes) time.sleep(2) rent = "500" self.EnterFreeRent(rent) time.sleep(2) lease = "600" self.EnterLeaseTerm(lease) time.sleep(2) self.CheckLabelYes() time.sleep(2) self.elementClick(self.click_Save_button) time.sleep(4) rfi_lease = self.getText(self.check_rfi_lease) rfilease = 'FRI – Lease' grossrent = self.getText(self.check_gross_rent) # grossrent = grossrent.split() # grossrent = grossrent[1] time.sleep(2) opEx = self.getText(self.check_opEx) # opEx = opEx.split() # opEx = opEx[1] time.sleep(2) allowances = self.getText(self.check_allowance) # allowances = allowances.split() # allowances = allowances[1] time.sleep(2) freerent = self.getText(self.check_free_rent) # freerent = freerent.split() # freerent = freerent[1] time.sleep(2) leaseterm = self.getText(self.check_lease_term) # leaseterm = leaseterm.split() # leaseterm = leaseterm[1] time.sleep(2) signage = 'Yes' signa = self.getText(self.check_signange) # signa = signa.split() # signa = signa[1] self.verifyTextContains(actualText=rfi_lease, expectedText=rfilease) # self.verifyTextContains(actualText=grossrent, expectedText=gross_rent) # self.log.info('!!!! Gross rent verification successfully !!!!') # self.verifyTextContains(actualText=opEx, expectedText=op_ex) # self.log.info('!!! OPEX verification successfully !!!!') # self.verifyTextContains(actualText=allowances, expectedText=allow) # self.log.info('!!! allowances verification successfully !!!!') # self.verifyTextContains(actualText=freerent, expectedText=rent) # self.log.info('!!!! Free rent verification successfully !!!!') # self.verifyTextContains(actualText=leaseterm, expectedText=lease) # self.log.info('!!!! Lease Term verification successfully !!!!') # self.verifyTextContains(actualText=signa, expectedText=signage) # self.log.info('!!!! signage verification successfully !!!!') click_performance_tab = "//div[contains(text(),'Performance')]" click_to_open_performance_tab = "//span[contains(text(),'Payback period')]" enter_ebitda_margin = "//input[@name='ebitdaMargin']" enter_breakeven_occupancy = "//input[@name='breakevenOccupancy']" enter_payback_period = "//input[@name='paybackPeriod']" enter_net_effective_rent = "//input[@name='netEffectiveRent']" enter_gross_npv = "//input[@name='grossNpv']" enter_adjusted_npv = "//input[@name='adjustedNpv']" enter_gross_construction_cost = "//input[@name='grossConstructionCost']" def EnterEbditaMargin(self, ebdita): self.elementClick(self.enter_ebitda_margin) time.sleep(2) self.sendKeys(ebdita, self.enter_ebitda_margin) def EnterBreakEven(self, breakeven): self.elementClick(self.enter_breakeven_occupancy) time.sleep(2) self.sendKeys(breakeven, self.enter_breakeven_occupancy) def EnterPayBackPeriod(self, payback): self.elementClick(self.enter_payback_period) time.sleep(2) self.sendKeys(payback, self.enter_payback_period) def EnterNetEffectiveRent(self, neteffective): self.elementClick(self.enter_net_effective_rent) time.sleep(2) self.sendKeys(neteffective, self.enter_net_effective_rent) def EnterGrossNPV(self, grossnpv): self.elementClick(self.enter_gross_npv) time.sleep(2) self.sendKeys(grossnpv, self.enter_gross_npv) def EnterAdjustedNPV(self, adjustednpv): self.elementClick(self.enter_adjusted_npv) time.sleep(2) self.sendKeys(adjustednpv, self.enter_adjusted_npv) def EnterGrossConstructionCost(self, grossconstructioncost): self.elementClick(self.enter_gross_construction_cost) time.sleep(2) self.clearField(self.enter_gross_construction_cost) time.sleep(2) self.sendKeys(grossconstructioncost, self.enter_gross_construction_cost) def PerformanceTab(self): time.sleep(2) self.elementClick(self.click_performance_tab) time.sleep(2) self.elementClick(self.click_to_open_performance_tab) time.sleep(2) ebdita = '30.3' self.EnterEbditaMargin(ebdita) time.sleep(2) breakeven = "40" self.EnterBreakEven(breakeven) time.sleep(2) payback = "37.95" self.EnterPayBackPeriod(payback) time.sleep(2) neteffective = '25' self.EnterNetEffectiveRent(neteffective) time.sleep(2) grossnpv = "21015" self.EnterGrossNPV(grossnpv) time.sleep(2) adjustednpv = "25425" self.EnterAdjustedNPV(adjustednpv) time.sleep(4) grossconstructioncost1 = "2580985" self.EnterGrossConstructionCost(grossconstructioncost1) time.sleep(2) self.elementClick(self.click_Save_button) time.sleep(4) g_value1 = self.getText(self.check_gross_value) g_value1 = g_value1.replace("$", '') g_value1 = g_value1.replace(",", '') self.verifyTextContains(actualText=g_value1, expectedText=grossconstructioncost1) click_floors_tab = "//div[contains(text(),'Floors')]" click_to_open_floors_tab = "//p[contains(text(),'Add floors')]" enter_floor = "//div[@id='app']/div/div[2]/div/div/div/div[2]/div/input" enter_rsf = "//td[2]//input[1]" enter_usf = "//td[3]//input[1]" enter_desk = "//td[4]//input[1]" check_rsf_after = "//div[@id='app']/div/div/div[2]/div/div[2]/div/div/div[7]/div/div[2]/div/div/ol/li/span[2]" enter_possession_date = "//td[5]//div[1]//div[1]//div[1]//div[1]//div[1]//input[1]" enter_opening_date = "//td[6]//div[1]//div[1]//div[1]//div[1]//div[1]//input[1]" def EnterFloor(self, floor_num): self.elementClick(self.enter_floor) time.sleep(2) self.sendKeys(floor_num, self.enter_floor) def pressEnter(self, value): self.sendKeys(value, self.enter_floor) def EnterRSF(self, rsf_num): self.elementClick(self.enter_rsf) time.sleep(2) self.sendKeys(rsf_num, self.enter_rsf) def EnterUSF(self, usf_num): self.elementClick(self.enter_usf) time.sleep(2) self.sendKeys(usf_num, self.enter_usf) def EnterDesk(self, desk_num): self.elementClick(self.enter_desk) time.sleep(2) self.sendKeys(desk_num, self.enter_desk) def FloorsTab(self): time.sleep(2) self.elementClick(self.click_floors_tab) time.sleep(2) self.elementClick(self.click_to_open_floors_tab) time.sleep(2) self.EnteringFloorValues() time.sleep(2) rsf_num = '10' rsf = self.getText(self.check_rsf_after) self.verifyTextContains(actualText=rsf, expectedText=rsf_num) def EnteringFloorValues(self): floor_num = '2' self.EnterFloor(floor_num) #self.EnterFloor(random.randrange(1, 10)) time.sleep(2) self.pressEnter(Keys.ENTER) rsf_num = '10' self.EnterRSF(rsf_num) time.sleep(2) usf_num = '15' self.EnterUSF(usf_num) time.sleep(2) desk_num = '12' self.EnterDesk(desk_num) time.sleep(2) self.DateSelectionPossessionAndOpeningDate() time.sleep(2) self.elementClick(self.click_Save_button) # Below methods we have created to enter opening and closing date def EnterFloorPossessionDate(self, pos_date): self.elementClick(self.enter_possession_date) time.sleep(2) self.sendKeys(pos_date, self.enter_possession_date) def EnterFloorOpeningDate(self, opening_date): self.elementClick(self.enter_opening_date) time.sleep(2) self.sendKeys(opening_date, self.enter_opening_date) ''' Steps: 1. use today's date using date time inbuilt function 2. for loop and select next date 3. next date used for possession 4. in else condition : 5. use day after tomorrow date i.e opening date ''' def DateSelectionPossessionAndOpeningDate(self): base = datetime.datetime.now() for x in range(1, 3): if x == 1: a = (base + datetime.timedelta(days=x)) a = (a.strftime("%m/%d/%Y")) self.log.info(a) self.EnterFloorPossessionDate(a) else: a = (base + datetime.timedelta(days=x)) a = (a.strftime("%m/%d/%Y")) self.log.info(a) time.sleep(2) self.EnterFloorOpeningDate(a) # C27837 Timeline > Milestones, Approval activity, Comments ''' Preconditions User should be logged into the app Steps 1.Create a new deal 2.Click on newly created deal 3.Click on comments section 4.Add some comment & click on Send button 5.Release the deal to stage D 6.Release the deal to stage C 7.Requests the deal 8.Request changes the deal 9.Cancel the release 10.Approve the deal Expected Result Everything related to deal creation, approval requests, approvals, comments should get displayed under Timeline section ''' comment_box = "//textarea[@placeholder='Type a comment']" send_button = "//button[contains(text(),'Send')]" # C27838 Deal changing status ''' Preconditions User should be on deal details screen Steps 1.Click on More icon "..." 2.Click on any of the displayed option 3.Click on Closed option 4.Click on Submit button from confirmation box Expected Result Deal's status should get changed to Closed and it should get reflected on deal details screen ''' menu_icon = ".sc-1eia494-0" click_closed = "//p[contains(text(),'Dead')]" submit_button = "//button[contains(text(),'Submit')]" after_closed_tag = "//div[contains(text(),'Dead')]" # newly added reason_dropdown = "//select[@name='reason']" select_option_for_reason = "//option[@value='OTHER']" textbox_for_reason = "//textarea[@placeholder='Enter an explanation']" def EnterReason(self, reasonname): self.elementClick(self.textbox_for_reason) time.sleep(2) self.sendKeys(reasonname, self.textbox_for_reason) def SubmitButton(self): self.elementClick(self.submit_button) def ClickMenuIcon(self): self.elementClick(self.menu_icon, locatorType='css') def DealChangingStatus(self): time.sleep(2) self.ClickMenuIcon() time.sleep(2) self.elementClick(self.click_closed) time.sleep(2) self.elementClick(self.reason_dropdown) time.sleep(2) self.elementClick(self.select_option_for_reason) time.sleep(2) reason_text = "testing" self.EnterReason(reason_text) time.sleep(2) self.SubmitButton() time.sleep(2) reactivate = self.getText(self.after_closed_tag) reactivate_text = "Dead" self.verifyTextContains(actualText=reactivate, expectedText=reactivate_text) # C27839 Location, Walkscore & Google place amenities ''' Preconditions User should be on deal details screen Steps 1.Scroll down the details screen 2.Click on Load button Expected Result Location of the deal should get displayed above map section - Walkscore details should get displayed left to map section in right side - Google place amenities should get displayed below map section as "Nearby bussiness" ''' scroll_to_location = "//a[contains(text(),'Location')]" load_button = "//button[contains(text(),'Load')]" near_by_business = "//p[contains(text(),'Restaurants')]" near_by_business_fitness = "//p[contains(text(),'Fitness')]" text_demand = "//span[contains(text(),'Demand')]" def LocationScreenGoogle(self): time.sleep(2) self.elementClick(self.scroll_to_location) time.sleep(2) text_to_verify_map = "Demand" get_text = self.getText(self.text_demand) time.sleep(2) self.verifyTextContains(actualText=get_text, expectedText=text_to_verify_map) # # self.elementClick(self.load_button) # # time.sleep(2) # restaurant = self.getText(self.near_by_business) # restaurant_text = "Restaurants" # fitness = self.getText(self.near_by_business_fitness) # fitness_text = "Fitness" # self.verifyTextContains(actualText=restaurant, expectedText=restaurant_text) # self.verifyTextContains(actualText=fitness, expectedText=fitness_text) # C33433 Button/link to create deal at existing location/place ''' Preconditions User should be on deal details screen Steps 1.Click on More icon 2.Click on + Add new deal button from modal box 3.Click on Add button from pop-up box Expected Result New deal should get created Newly created deal's detail screen should get displayed Old already available deal should have its deal number get displayed i.e. Deal 1/Deal 2/ .. 1.Click on + Add new deal link displayed below Other deals at this property 2.Click on Add button from pop-up box Note : This link will only get enabled once there are other deals available to that property Expected Result New deal should get created Newly created deal's detail screen should get displayed Old already available deal should have its deal number get displayed i.e. Deal 1/Deal 2/ ''' add_new_deal = ".deal-options--grid:nth-child(2)" click_add_button = "//button[contains(text(),'Add')]" deal_tag = "//div[contains(text(),'Deal')]" def CreateDealFromExistingDeal(self): time.sleep(2) self.elementClick(self.menu_icon, locatorType='css') time.sleep(2) self.elementClick(self.add_new_deal, locatorType="css") time.sleep(2) self.elementClick(self.click_add_button) time.sleep(5) deal_tag_name = self.getText(self.deal_tag) tag_name = "Deal" self.verifyTextContains(actualText=deal_tag_name, expectedText=tag_name) add_deal_from_created_deal = "//p[contains(.,'+ Add new deal at this location')]" deal_tag1 = "//div[contains(text(),'Deal')]" def AddDealFromCreatedDeal(self): time.sleep(2) self.elementClick(self.add_deal_from_created_deal) time.sleep(2) self.elementClick(self.click_add_button) time.sleep(2) deal_tag_name = self.getText(self.deal_tag1) tag_name = "Deal" self.verifyTextContains(actualText=deal_tag_name, expectedText=tag_name) # C39538 Deal details > Performance tab ''' Steps 1 "GrossConstructionCost field exists in the Performance tab" 1.Click on any deal 2.Click on the Performance tab. Expected Result A field called Gross Construction Cost is available on the Performance Tab after 'Adjusted NPV' and before 'Annual Escalations'. 2 "GrossConstructionCost field is editable by the user" 1.Open a deal from stage C or later 2.Open the Performance tab 3.Edit the gross construction cost Expected Result The old value no longer shows and the new value is persisted on the page, even after reload. ''' gross_text = "//span[contains(text(),'Total Gross CapEx')]" def GrossConstructionCostONPerformanceTab(self): time.sleep(2) self.innerScroll(self.click_terms_tab) time.sleep(2) self.elementClick(self.click_performance_tab) time.sleep(2) verify_gross_text = self.getText(self.gross_text) verify_text = "Total Gross CapEx" self.verifyTextContains(actualText=verify_gross_text, expectedText=verify_text) click_closed_tag_to_back_to_deal1 = "//div[@id='location']/div[2]/div[2]/div/div[2]/div/div/div/p" check_gross_value = "//li[7]//span[2]" def GrossConstructionFieldEditable(self): time.sleep(2) # self.elementClick(self.click_closed_tag_to_back_to_deal1) # time.sleep(4) self.innerScroll(self.click_terms_tab) time.sleep(2) self.elementClick(self.click_performance_tab) time.sleep(2) self.elementClick(self.click_to_open_performance_tab) time.sleep(4) grossconstructioncost = "300000" self.EnterGrossConstructionCost(grossconstructioncost) time.sleep(2) self.elementClick(self.click_Save_button) time.sleep(4) g_value = self.getText(self.check_gross_value) g_value = g_value.replace("$", '') g_value = g_value.replace(",", '') self.verifyTextContains(actualText=g_value, expectedText=grossconstructioncost) def VerifyPerformanceSectionTabNotEditable(self): time.sleep(2) self.elementClick(self.click_closed_tag_to_back_to_deal1) time.sleep(4) self.innerScrollUp(self.click_performance_tab) time.sleep(2) self.elementClick(self.click_performance_tab) time.sleep(2) self.elementClick(self.click_to_open_performance_tab) time.sleep(2) text = 'Performance' text_tab = self.getText(self.click_performance_tab) self.verifyTextContains(actualText=text_tab, expectedText=text)