def assert_start_page(web_driver: webdriver): """Test the MyakuWeb start page with the web driver.""" viewport_width = web_driver.get_window_size()['width'] _go_to_start_page(web_driver) assert_css_loaded(web_driver) assert_element_by_tag(web_driver, 'title', 'Myaku', False) header_element = web_driver.find_element_by_tag_name('header') assert_search_header(header_element, viewport_width) main_element = web_driver.find_element_by_tag_name('main') assert_start_tiles(main_element)
def body_text(driver: webdriver): try: WebDriverWait(driver, DELAY).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) return driver.find_element_by_tag_name("body").text except TimeoutException: logging.info("Timed out waiting for body to load") return ""
def get_links(driver: webdriver) -> Issues_Links: tag = driver.find_element_by_tag_name('table') issue_links: list = [] links = tag.find_elements_by_tag_name('a') for link in links: issue_links.append(list([link.get_attribute('href'), link.text])) return issue_links
def try_mute(driver: webdriver): try: driver.switch_to_frame(driver.find_element_by_tag_name("iframe")) elem = driver.find_element_by_id("applixir_video_ima-mute-div") elem.click() print("muted") driver.switch_to_default_content() except: driver.switch_to_default_content() print("fail to mute")
def courseDetails(driver: webdriver, url: str): driver.get(url) #time.sleep(7) l = WebDriverWait(driver, timeout=10).until( expected_conditions.presence_of_element_located( (By.CSS_SELECTOR, "div[jsname='rymPhb']"))) # while not WebDriverWait(driver, timeout=10).until(expected_conditions.element_to_be_clickable(l.find_element_by_tag_name("div"))): # time.sleep(2) check_height = driver.execute_script("return document.body.scrollHeight;") while True: driver.execute_script( "window.scrollTo(0, document.body.scrollHeight);") time.sleep(4) height = driver.execute_script("return document.body.scrollHeight;") if height == check_height: break check_height = height pg = BeautifulSoup(driver.page_source, "lxml") temp = pg.find(name="div", attrs={"jsname": "rymPhb"}) assign, material, text = [], [], [] for i in range(len(temp.contents)): if len(temp.contents[i]["class"]) > 4: j = temp.contents[i].contents[0].contents[0].contents text = j[2].contents[0].contents[1].contents[0].string.split( ": ")[1] date = j[2].contents[1].contents[1].string if j[0]["aria-label"][0] == "A": assign.append([i, text, date]) else: material.append([i, text, date]) time.sleep(3) total = driver.find_elements(By.CSS_SELECTOR, "div[jsname='rymPhb'] > div") for i in assign: #WebDriverWait(driver, timeout = 5).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "div[jsname='rymPhb']"))) driver.execute_script("arguments[0].click();", total[i[0]]) #total[i[0]].click() time.sleep(3) assignment = BeautifulSoup(driver.page_source, "lxml") WebDriverWait(driver, timeout=6).until( expected_conditions.visibility_of( driver.find_elements_by_class_name("W4hhKd")[-1])) details = assignment.find_all(name="div", attrs={"class": "W4hhKd" })[-1].contents #make DOM visible i.append(details[1].string) #due date if i[-1] is None: i[-1] = "No due date" #i.append(details[0].contents[0].contents[0].string) #max marks if len(details[0].contents) == 0: i.append("No marks mentioned") i.append("No marks received") else: temp = details[0].contents[0].contents[0].contents if len(temp) > 1: i.append(temp[1].string.split()[-1]) i.append(temp[1].string.split()[0]) else: i.append(temp[0]) i.append("No marks received") details = assignment.find_all(name="aside", attrs={ "class": "asCVDb" })[-1].contents[0].contents[0].contents[1].contents[0] if details.contents[0].string[0] == 'A': i.append(details.contents[0].string + " (Not submitted)") else: i.append(details.contents[0].string) i[0] = driver.current_url driver.find_element_by_tag_name("nav").find_element_by_tag_name( "div").find_element_by_tag_name("div").find_element_by_tag_name( "div").find_element_by_tag_name("h1").find_element_by_tag_name( "a").click() time.sleep(2) for i in material: total[i[0]].click() time.sleep(2) i[0] = driver.current_url driver.find_element_by_tag_name("nav").find_element_by_tag_name( "div").find_element_by_tag_name("div").find_element_by_tag_name( "div").find_element_by_tag_name("h1").find_element_by_tag_name( "a").click() time.sleep(2) return assign, material
def cita_selection(driver: webdriver, context: CustomerProfile): try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.TAG_NAME, "body"))) except TimeoutException: logging.error("Timed out waiting for body to load") return None resp_text = driver.find_element_by_tag_name("body").text if "DISPONE DE 5 MINUTOS" in resp_text: logging.info("Cita attempt -> selection hit! :)") if context.save_artifacts: driver.save_screenshot( f"citas-{datetime.datetime.now()}.png".replace(":", "-")) try: driver.find_elements_by_css_selector( "input[type='radio'][name='rdbCita']")[0].send_keys(Keys.SPACE) except Exception as e: logging.error(e) pass btn = driver.find_element_by_id("btnSiguiente") btn.send_keys(Keys.ENTER) driver.switch_to.alert.accept() else: logging.info("Cita attempt -> missed selection :(") return None # 9. Confirmation try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.TAG_NAME, "body"))) except TimeoutException: logging.error("Timed out waiting for body to load") return None resp_text = driver.find_element_by_tag_name("body").text if "Debe confirmar los datos de la cita asignada" in resp_text: logging.info("Cita attempt -> confirmation hit! :)") if context.telegram_token: dispatcher = context.updater.dispatcher def shutdown(): context.updater.stop() context.updater.is_idle = False def code_received(update, ctx): logging.info(f"Received code: {ctx.args[0]}") element = driver.find_element_by_id("txtCodigoVerificacion") element.send_keys(ctx.args[0]) driver.find_element_by_id("chkTotal").send_keys(Keys.SPACE) driver.find_element_by_id("enviarCorreo").send_keys(Keys.SPACE) btn = driver.find_element_by_id("btnConfirmar") btn.send_keys(Keys.ENTER) try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.TAG_NAME, "body"))) except TimeoutException: logging.info("Timed out waiting for body to load") return None resp_text = driver.find_element_by_tag_name("body").text ctime = datetime.datetime.now() if "CITA CONFIRMADA Y GRABADA" in resp_text: context.bot_result = True code = driver.find_element_by_id("justificanteFinal").text logging.info(f"Justificante cita: {code}") caption = f"Cita confirmed! {code}" if context.save_artifacts: image_name = f"CONFIRMED-CITA-{ctime}.png".replace( ":", "-") driver.save_screenshot(image_name) ctx.bot.send_photo( chat_id=update.effective_chat.id, photo=open(os.path.join(os.getcwd(), image_name), "rb"), caption=caption, ) btn = driver.find_element_by_id("btnImprimir") btn.send_keys(Keys.ENTER) else: ctx.bot.send_message(chat_id=update.effective_chat.id, text=caption) threading.Thread(target=shutdown).start() return True elif "Lo sentimos, el código introducido no es correcto" in resp_text: ctx.bot.send_message(chat_id=update.effective_chat.id, text="Incorrect, please try again") else: error_name = f"error-{ctime}.png".replace(":", "-") driver.save_screenshot(error_name) ctx.bot.send_photo( chat_id=update.effective_chat.id, photo=open(os.path.join(os.getcwd(), error_name), "rb"), ) ctx.bot.send_message(chat_id=update.effective_chat.id, text="Something went wrong") dispatcher.add_handler( CommandHandler("code", code_received, pass_args=True)) context.updater.start_polling(poll_interval=1.0) for i in range(5): speaker.say("ALARM") # Waiting for response 5 minutes time.sleep(360) threading.Thread(target=shutdown).start() if context.save_artifacts: driver.save_screenshot( f"FINAL-SCREEN-{datetime.datetime.now()}.png".replace( ":", "-")) if context.bot_result: driver.quit() os._exit(0) return None else: for i in range(5): speaker.say("ALARM") logging.info("Press Any button to CLOSE browser") input() else: logging.info("Cita attempt -> missed confirmation :(") if context.save_artifacts: driver.save_screenshot( f"failed-confirmation-{datetime.datetime.now()}.png".replace( ":", "-")) return None
def cycle_cita(driver: webdriver, context: CustomerProfile): driver.delete_all_cookies() try: driver.execute_script("window.localStorage.clear();") driver.execute_script("window.sessionStorage.clear();") except Exception as e: logging.error(e) pass if context.fast_forward_url: while True: try: driver.set_page_load_timeout(300 if context.first_load else 50) driver.get(context.fast_forward_url) except TimeoutException: logging.error("Timed out loading initial page") continue break context.first_load = False session_id = driver.get_cookie("JSESSIONID").get("value") logging.info(session_id) else: driver.get( "https://sede.administracionespublicas.gob.es/icpplus/index.html") time.sleep(1) # Let the user actually see something! # Select "Barcelona" select = Select(driver.find_element_by_id("form")) select.select_by_visible_text(context.city) btn = driver.find_element_by_id("btnAceptar") btn.send_keys(Keys.ENTER) # 2. Tramite selection: try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.ID, "tramiteGrupo[1]"))) except TimeoutException: logging.error("Timed out waiting for tramite to load") return None select = Select(driver.find_element_by_id("tramiteGrupo[1]")) # Select "Huellos" select.select_by_value(context.operation_code.value) btn = driver.find_element_by_id("btnAceptar") btn.send_keys(Keys.ENTER) # 3. Instructions page: try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.ID, "btnEntrar"))) except TimeoutException: logging.error("Timed out waiting for Instructions page to load") return None btn = driver.find_element_by_id("btnEntrar") btn.send_keys(Keys.ENTER) # 4. Data form: success = False if context.operation_code == OperationType.TOMA_HUELLAS: success = toma_huellas_step2(driver, context) elif context.operation_code == OperationType.RECOGIDA_DE_TARJETA: success = recogida_de_tarjeta_step2(driver, context) elif context.operation_code == OperationType.SOLICITUD: success = solicitud_step2(driver, context) if not success: return None try: wait_exact_time(driver, context) except TimeoutException: logging.error("Timed out waiting for exact time") return None # 5. Solicitar cita: btn = driver.find_element_by_id("btnEnviar") btn.send_keys(Keys.ENTER) for i in range(REFRESH_PAGE_CYCLES): try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.TAG_NAME, "body"))) except TimeoutException: logging.error("Timed out waiting for body to load") return None resp_text = driver.find_element_by_tag_name("body").text if "Seleccione la oficina donde solicitar la cita" in resp_text: logging.info("Towns hit! :)") # 6. Office selection: time.sleep(0.3) try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.ID, "btnSiguiente"))) except TimeoutException: logging.error("Timed out waiting for offices to load") return None res = select_office(driver, context) if res is None: time.sleep(5) driver.refresh() continue btn = driver.find_element_by_id("btnSiguiente") btn.send_keys(Keys.ENTER) break elif "En este momento no hay citas disponibles" in resp_text: time.sleep(5) driver.refresh() continue else: logging.info("No towns") return None # 7. phone-mail: try: WebDriverWait(driver, DELAY).until( EC.presence_of_element_located((By.ID, "emailDOS"))) logging.info("Email page hit") except TimeoutException: logging.error("Timed out waiting for phone/email to load") return None element = driver.find_element_by_id("txtTelefonoCitado") element.send_keys(context.phone) # phone num element = driver.find_element_by_id("emailUNO") element.send_keys(context.email) element = driver.find_element_by_id("emailDOS") element.send_keys(context.email) btn = driver.find_element_by_id("btnSiguiente") btn.send_keys(Keys.ENTER) return cita_selection(driver, context)
def CLR_Html(browser: webdriver, Name: str) -> str: """ a = CLR_Html(self.b, ['page_name', 'profile_message_send', 'profile_action_btn', 'profile_msg_split']) print(a) :param Name: :param browser: :return: """ res = [] all_res = [] # a = Soport_webdriver.CLR_Html(b,['mail_box_send']) for name in Name: try: all_res.append(browser.find_element_by_id(name).text) res.append('find_element_by_id') except: pass try: all_res.append(browser.find_element_by_name(name).text) res.append('find_element_by_name') except: pass try: all_res.append(browser.find_element_by_xpath(name).text) res.append('find_element_by_xpath') except: pass try: all_res.append(browser.find_element_by_link_text(name).text) res.append('find_element_by_link_text') except: pass try: all_res.append( browser.find_element_by_partial_link_text(name).text) res.append('find_element_by_partial_link_text') except: pass try: all_res.append(browser.find_element_by_tag_name(name).text) res.append('find_element_by_tag_name') except: pass try: all_res.append(browser.find_element_by_class_name(name).text) res.append('find_element_by_class_name') except: pass try: all_res.append(browser.find_element_by_css_selector(name).text) res.append('find_element_by_css_selector') except: pass io = '' for x in range(len(res)): io += '{} |-| {} |-| {}\n'.format(str(Name[x]), str(res[x]), str(all_res[x])) return io