I have written a full selenium script that's working but not all the time as whem I try to select meals (this is last sections of the page), I sometimes get two errors.
One error is a timeout exception as it waits for a meal drop down to have an option selected, wait for it to be clickable again after it loads its selected option before moving onto the next option. I assume for this I need to set the wait = WebDriverWait(driver, 20)
to longer than 20 seconds just in case the drop down options are taking longer to load.
Another issue I am having an seems to be occurring a lot in the meals page is this 'Element is no longer attached to the DOM'
issue. Again this usually happens when I am on the meals page. Doing some research it seems to be possible that a javascript could be causing this issue but not too sure. Could it be to fix this issue I need to include more waits or maybe I should be looking to refresh pages after navigating from one page to another?
Below I only pasted the relevant code. If you want to view the whole code and try it yourself on the application, then send me a comment.
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC ... driver = webdriver.Firefox() #driver = webdriver.Chrome() driver.get("http://www.jet2.com") driver.maximize_window() wait = WebDriverWait(driver, 20) actions = ActionChains(driver) ... # proceed to the next page (meals) submit_seat_selection = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#AllInboundPassengersSeatedOk button.submitseatselection"))) submit_seat_selection.click() meals = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_MainContent_InFlightMeal_removeMealButton"))) #Meal details pax_one_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDown")) pax_one_ob_meal.select_by_index(0) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDown"))) pax_one_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDownIn")) pax_one_ib_meal.select_by_index(2) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDownIn"))) pax_two_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDown")) pax_two_ob_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDown"))) pax_two_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDownIn")) pax_two_ib_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDownIn"))) pax_three_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDown")) pax_three_ob_meal.select_by_index(2) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDown"))) pax_three_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDownIn")) pax_three_ib_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDownIn"))) pax_four_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDown")) pax_four_ob_meal.select_by_index(0) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDown"))) pax_four_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDownIn")) pax_four_ib_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDownIn")))
UPDATE:
Below is the whole code as requested:
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from datetime import datetime, timedelta import settings # Search Flights FROM = "Leeds Bradford" TO = "Antalya" # PAX Details PAX1_FORENAME = "Dad" PAX2_FORENAME = "Mum" PAX3_FORENAME = "Son" PAX4_FORENAME = "Daughter" PAX5_FORENAME = "Baby" PAX_SURNAME = "Test" #Payment Details NAME_ON_CARD = "Mr Test" CARD_NUMBER = "1000070000000001" SECURITY_CODE = "111" #Contact Details CONTACT_FIRST_NAME = "Dad" CONTACT_LAST_NAME = "Test" POSTCODE = "LS11 9AW" MOBILE_PHONE = "07766554433" DESTINATION_PHONE = "01122334455" HOME_PHONE = "01234567890" EMAIL = settings.EMAIL def select_date(calendar, mininum_date=None): try: # check if "Your Date" is there your_date_elm = calendar.find_element_by_class_name("your-date") your_date = your_date_elm.get_attribute("data-date") print("Found 'Your Date': " + your_date) your_date_elm.click() # check if your_date against the minimum date if given your_date = datetime.strptime(your_date, "%Y-%m-%d") if mininum_date and your_date < mininum_date: raise NoSuchElementException("Minimum date violation") return your_date except NoSuchElementException: flight_date = None flight_date_elm = None while True: print("Processing " + calendar.find_element_by_css_selector("div.subheader > p").text) try: if mininum_date: flight_date_elms = calendar.find_elements_by_class_name("flights") flight_date_elm = next(flight_date_elm for flight_date_elm in flight_date_elms if datetime.strptime(flight_date_elm.get_attribute("data-date"), "%Y-%m-%d") >= mininum_date) else: flight_date_elm = calendar.find_element_by_class_name("flights") except (StopIteration, NoSuchElementException): calendar.find_element_by_partial_link_text("Next month").click() # if found - print out the date, click and exit the loop if flight_date_elm: flight_date = flight_date_elm.get_attribute("data-date") print("Found 'Flight Date': " + flight_date) flight_date_elm.click() break return datetime.strptime(flight_date, "%Y-%m-%d") driver = webdriver.Firefox() #driver = webdriver.Chrome() driver.get("http://www.jet2.com") driver.maximize_window() wait = WebDriverWait(driver, 90) actions = ActionChains(driver) # wait for the page to load wait.until(EC.presence_of_element_located((By.ID, "departure-airport-input"))) # fill out the form return_flight = driver.find_element_by_id('return-flight-selector').click() depart_from = driver.find_element_by_id("departure-airport-input").send_keys(FROM) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#ui-id-1 .ui-menu-item"))).click() go_to = driver.find_element_by_id("destination-airport-input").send_keys(TO) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#ui-id-2 .ui-menu-item"))).click() # select depart date datepicker = driver.find_element_by_id("departure-date-selector") actions.move_to_element(datepicker).click().perform() # find the calendar, month and year picker and the current date calendar = driver.find_element_by_id("departureDateContainer") month_picker = Select(calendar.find_element_by_class_name("ui-datepicker-month")) year_picker = Select(calendar.find_element_by_class_name("ui-datepicker-year")) current_date = calendar.find_element_by_class_name("ui-datepicker-current-day") # printing out current date month = month_picker.first_selected_option.text year = year_picker.first_selected_option.text print("Current departure date: {day} {month} {year}".format(day=current_date.text, month=month, year=year)) # see if we have an available date in this month try: next_available_date = current_date.find_element_by_xpath("following::td[@data-handler='selectDay' and ancestor::div/@id='departureDateContainer']") print("Found an available departure date: {day} {month} {year}".format(day=next_available_date.text, month=month, year=year)) next_available_date.click() except NoSuchElementException: # looping over until the next available date found while True: # click next, if not found, select the next year try: calendar.find_element_by_class_name("ui-datepicker-next").click() except NoSuchElementException: # select next year year = Select(calendar.find_element_by_class_name("ui-datepicker-year")) year.select_by_visible_text(str(int(year.first_selected_option.text) + 1)) # reporting current processed month and year month = Select(calendar.find_element_by_class_name("ui-datepicker-month")).first_selected_option.text year = Select(calendar.find_element_by_class_name("ui-datepicker-year")).first_selected_option.text print("Processing {month} {year}".format(month=month, year=year)) try: next_available_date = calendar.find_element_by_xpath(".//td[@data-handler='selectDay']") print("Found an available departure date: {day} {month} {year}".format(day=next_available_date.text, month=month, year=year)) next_available_date.click() break except NoSuchElementException: continue # select return date datepicker = driver.find_element_by_id("return-date-selector") actions.move_to_element(datepicker).click().perform() # find the calendar, month and year picker and the current date calendar = driver.find_element_by_id("returnDateContainer") month_picker = Select(calendar.find_element_by_class_name("ui-datepicker-month")) year_picker = Select(calendar.find_element_by_class_name("ui-datepicker-year")) current_date = calendar.find_element_by_class_name("ui-datepicker-current-day") # printing out current date month = month_picker.first_selected_option.text year = year_picker.first_selected_option.text print("Current return date: {day} {month} {year}".format(day=current_date.text, month=month, year=year)) # see if we have an available date in this month try: next_available_date = current_date.find_element_by_xpath("following::td[@data-handler='selectDay' and ancestor::div/@id='returnDateContainer']") print("Found an available return date: {day} {month} {year}".format(day=next_available_date.text, month=month, year=year)) next_available_date.click() except NoSuchElementException: # looping over until the next available date found while True: # click next, if not found, select the next year try: calendar.find_element_by_class_name("ui-datepicker-next").click() except NoSuchElementException: # select next year year = Select(calendar.find_element_by_class_name("ui-datepicker-year")) year.select_by_visible_text(str(int(year.first_selected_option.text) + 1)) # reporting current processed month and year month = Select(calendar.find_element_by_class_name("ui-datepicker-month")).first_selected_option.text year = Select(calendar.find_element_by_class_name("ui-datepicker-year")).first_selected_option.text print("Processing {month} {year}".format(month=month, year=year)) try: next_available_date = calendar.find_element_by_xpath(".//td[@data-handler='selectDay']") print("Found an available return date: {day} {month} {year}".format(day=next_available_date.text, month=month, year=year)) next_available_date.click() break except NoSuchElementException: continue #select adults adults = Select(driver.find_element_by_id("adults-number")) adults.select_by_visible_text("2") #select children children = Select(driver.find_element_by_id("children-number")) children.select_by_visible_text("2") #children ages child_one = Select(driver.find_element_by_id("childSelect1")) child_one.select_by_visible_text("4") child_two = Select(driver.find_element_by_id("childSelect2")) child_two.select_by_visible_text("6") confirm = driver.find_element_by_link_text("Confirm") confirm.click() #select infants infants = Select(driver.find_element_by_id("infants-number")) infants.select_by_visible_text("1") #search flights search_flight = driver.find_element_by_id("search-flights").click() # get the outbound date outbound = wait.until(EC.visibility_of_element_located((By.ID, "outboundsearchresults"))) outbound_date = select_date(outbound) # get the inbound date inbound = driver.find_element_by_id("inboundsearchresults") inbound_minimum_date = outbound_date + timedelta(days=7) inbound_date = select_date(inbound, mininum_date=inbound_minimum_date) print(outbound_date, inbound_date) # continue after flights selected proceed_to_pax = driver.find_element_by_id('navigateActionNext').click() pax_page = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_MainContent_passengerList_PassengerGridView_ctl08_butAddBagsForAll"))) #select currency currency = Select(driver.find_element_by_id("ctl00_MainContent_dynamicCurrencyDropDown")) currency.select_by_value("1") #Passenger details pax_one_title = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl02_TitleDropDownList")) pax_one_title.select_by_visible_text("Mr") pax_one_forename = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl02_ForeNameTextBox").send_keys(PAX1_FORENAME) pax_one_surname = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl02_SurNameTextBox").send_keys(PAX_SURNAME) pax_two_title = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl03_TitleDropDownList")) pax_two_title.select_by_visible_text("Mrs") pax_two_forename = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl03_ForeNameTextBox").send_keys(PAX2_FORENAME) pax_two_surname = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl03_SurNameTextBox").send_keys(PAX_SURNAME) pax_three_title = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl04_TitleDropDownList")) pax_three_title.select_by_visible_text("Mr") pax_three_forename = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl04_ForeNameTextBox").send_keys(PAX3_FORENAME) pax_three_surname = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl04_SurNameTextBox").send_keys(PAX_SURNAME) pax_four_title = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl05_TitleDropDownList")) pax_four_title.select_by_visible_text("Ms") pax_four_forename = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl05_ForeNameTextBox").send_keys(PAX4_FORENAME) pax_four_surname = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl05_SurNameTextBox").send_keys(PAX_SURNAME) pax_five_title = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl06_TitleDropDownList")) pax_five_title.select_by_visible_text("Mstr") pax_five_forename = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl06_ForeNameTextBox").send_keys(PAX5_FORENAME) pax_five_surname = driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl06_SurNameTextBox").send_keys(PAX_SURNAME) #pax baggage pax_one_bags = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl02_baggageOutDropDown")) pax_one_bags.select_by_value("1") pax_two_bags = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl03_baggageOutDropDown")) pax_two_bags.select_by_value("1") pax_three_bags = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl04_baggageOutDropDown")) pax_three_bags.select_by_value("1") pax_four_bags = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl05_baggageOutDropDown")) pax_four_bags.select_by_value("1") pax_one_golf = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl02_GolfDropDown")) pax_one_golf.select_by_value("1") pax_two_bike = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl03_BikesDropDown")) pax_two_bike.select_by_value("1") #infant carer infant_one_carer = Select(driver.find_element_by_id("ctl00_MainContent_passengerList_PassengerGridView_ctl06_InfantCarerDropDown")) infant_one_carer.select_by_visible_text("Mr Dad Test") #checkin #online = driver.find_element_by_id("ctl00_MainContent_passengerList_checkinOnline").click() airport = driver.find_element_by_id("ctl00_MainContent_passengerList_checkinAirport").click() #continue to seats continue_pax = driver.find_element_by_id("pageContinue").click() #modal_outer = wait.until(EC.invisibility_of_element_located((By.ID, "ctl00_MainContent_PageTransitionDialog_messageWrapper"))) #continue_again = wait.until(EC.element_to_be_clickable((By.ID, "pageContinue"))).click(); seats_page = wait.until(EC.visibility_of_element_located((By.ID, "findyourseat"))) #seats selection - outbound for outbound_passenger in driver.find_elements_by_css_selector("ol[data-flightbound='Outbound'] li[data-personid]"): outbound_passenger.click() #driver.find_elements_by_css_selector("ol.passengerlist li[data-personid]"): outbound_has_infant = outbound_passenger.get_attribute("data-hasinfant") # choose seats if outbound_has_infant: # select a non-selected infant seat outbound_seat = driver.find_element_by_css_selector(".outbound .planebody a.seat.infant:not(.reserved):not(.selected)") else: # select a non-reserved non-selected seat outbound_seat = driver.find_element_by_css_selector(".outbound .planebody a.seat:not(.reserved):not(.selected)") print("Passenger: %s, choosing seat: %s" % (outbound_passenger.text.strip(), outbound_seat.get_attribute("data-seat"))) outbound_seat.click() outbound_plan = wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "outbound"))) inbound_plan = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "inbound"))) #seats selection - inbound for inbound_passenger in driver.find_elements_by_css_selector("ol[data-flightbound='Inbound'] li[data-personid]"): inbound_passenger.click() #driver.find_elements_by_css_selector("ol.passengerlist li[data-personid]"): inbound_has_infant = inbound_passenger.get_attribute("data-hasinfant") # choose seats if inbound_has_infant: # select a non-selected infant seat inbound_seat = driver.find_element_by_css_selector(".inbound .planebody a.seat.infant:not(.reserved):not(.selected)") else: # select a non-reserved non-selected seat inbound_seat = driver.find_element_by_css_selector(".inbound .planebody a.seat:not(.reserved):not(.selected)") print("Passenger: %s, choosing seat: %s" % (inbound_passenger.text.strip(), inbound_seat.get_attribute("data-seat"))) inbound_seat.click() # proceed to the next page (meals) submit_seat_selection = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#AllInboundPassengersSeatedOk button.submitseatselection"))) submit_seat_selection.click() meals = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_MainContent_InFlightMeal_removeMealButton"))) #Meal details pax_one_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDown")) pax_one_ob_meal.select_by_index(0) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDown"))) pax_one_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDownIn")) pax_one_ib_meal.select_by_index(2) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl02_mealsDropDownIn"))) pax_two_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDown")) pax_two_ob_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDown"))) pax_two_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDownIn")) pax_two_ib_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl03_mealsDropDownIn"))) pax_three_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDown")) pax_three_ob_meal.select_by_index(2) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDown"))) pax_three_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDownIn")) pax_three_ib_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl04_mealsDropDownIn"))) pax_four_ob_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDown")) pax_four_ob_meal.select_by_index(0) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDown"))) pax_four_ib_meal = Select(driver.find_element_by_id("ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDownIn")) pax_four_ib_meal.select_by_index(1) wait.until(EC.element_to_be_clickable((By.ID, "ctl00_MainContent_InFlightMeal_PassengerGridView_ctl05_mealsDropDownIn"))) # Select Insurance yes_insurance = driver.find_element_by_id('ctl00_MainContent_TravelInsuranceView_insuranceRequiredYes').click() single_trip = driver.find_element_by_xpath('//input[@id="ctl00_MainContent_TravelInsuranceView_insuranceProduct1" and not(@disabled)]').click() driver.find_element_by_xpath('//span[@id="insurance-button-submit" and (@disabled="false")]') confirm_insurance = driver.find_element_by_id('ctl00_MainContent_TravelInsuranceView_InsuranceSubmitButton').click() nearly_there = wait.until(EC.invisibility_of_element_located((By.ID, "ct100_MainContent_PageTransitionDialog_messageWrapper"))) checkout_btn = wait.until(EC.element_to_be_clickable((By.NAME, "ctl00$MainContent$forwardButton"))).click() # Proceed to Payment Page payment_page = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_MainContent_rbCreditcard"))) # Payment details payment_method = driver.find_element_by_id('ctl00_MainContent_rbCreditcard').click() wait.until(EC.invisibility_of_element_located((By.ID, "PleaseWaitDialog"))) name_on_card = driver.find_element_by_id("nameOnCard").send_keys(NAME_ON_CARD) card_type = Select(driver.find_element_by_id("cardType")) card_type.select_by_visible_text("Visa") wait.until(EC.invisibility_of_element_located((By.ID, "PleaseWaitDialog"))) card_number = driver.find_element_by_id("cardNumber").send_keys(CARD_NUMBER) exp_month = Select(driver.find_element_by_id("month")) exp_month.select_by_index(1) exp_year = Select(driver.find_element_by_id("year")) exp_year.select_by_index(2) security_code = driver.find_element_by_id("cardVerificationNumber").send_keys(SECURITY_CODE) # Contact details title = Select(driver.find_element_by_id("ctl00_MainContent_addressView_contactTitleDropDown")) title.select_by_visible_text("Mr") contact_first_name = driver.find_element_by_id("ctl00_MainContent_addressView_contactFirstNameTextBox").send_keys(CONTACT_FIRST_NAME) contact_last_name = driver.find_element_by_id("ctl00_MainContent_addressView_contactLastNameTextBox").send_keys(CONTACT_LAST_NAME) country = Select(driver.find_element_by_id("ctl00_MainContent_addressView_countryDropDown")) country.select_by_visible_text("United Kingdom") find_address = driver.find_element_by_id('ctl00_MainContent_addressView_CheckPostcodeButton').click() postcode_find = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_MainContent_postcodeLookupDiv"))) postcode = driver.find_element_by_id("ctl00_MainContent_ThePostCodeTextBox").send_keys(POSTCODE) search_again = driver.find_element_by_id('FindAgainButton').click() address_shown = wait.until(EC.visibility_of_element_located((By.XPATH, '//option'))) address_pick = Select(driver.find_element_by_id("ctl00_MainContent_PostCodeListBox")) address_pick.select_by_value("50774613") found_button = driver.find_element_by_id('ctl00_MainContent_FoundButton').click() postcode_disappear = wait.until(EC.invisibility_of_element_located((By.ID, "ctl00_MainContent_postcodeLookupDiv"))) mobile_phone = driver.find_element_by_id("ctl00_MainContent_addressView_leadPhoneDestTextBox").send_keys(MOBILE_PHONE) destination_phone = driver.find_element_by_id("ctl00_MainContent_addressView_destPhoneTextBox").send_keys(DESTINATION_PHONE) home_phone = driver.find_element_by_id("ctl00_MainContent_addressView_leadPhoneTextBox").send_keys(HOME_PHONE) email = driver.find_element_by_id("ctl00_MainContent_addressView_emailAddTextBox").send_keys(EMAIL) confirm_email = driver.find_element_by_id("ctl00_MainContent_addressView_confirmEmailTextBox").send_keys(EMAIL) news_checkbox = driver.find_element_by_id('ctl00_MainContent_newsCheckBox').click() travel_reason = Select(driver.find_element_by_id("ctl00_MainContent_reasonForTravelDropDown")) travel_reason.select_by_visible_text("Holiday") first_time = driver.find_element_by_id('ctl00_MainContent_FirstTimeUserRadio_1').click() tandc = driver.find_element_by_id('ctl00_MainContent_chkAcceptTandCs').click() #complete_booking = driver.find_element_by_id('ctl00_MainContent_continueButton') #complete_booking.click()