def open_cds(cfg_path: str ='', pass_path: str='') -> WebDriver: config_path = cfg_path if cfg_path else 'config.json' with open(config_path) as f: config = json.load(f) password_path = pass_path if pass_path else '.pass' with open(password_path) as f: credential = json.load(f) chrome_option = webdriver.ChromeOptions() chrome_option.add_experimental_option("prefs", {"download.default_directory": os.path.join(os.getcwd(), 'template')}) if 'driver_executable_path' in config and os.path.exists(config['driver_executable_path']): browser_driver = Chrome(executable_path=config['driver_executable_path'], chrome_options=chrome_option) else: browser_driver = Chrome(chrome_options=chrome_option) browser_driver.get(config['url_link_cds_eit100']) input_email = browser_driver.find_element_by_css_selector('input[name= "USER"]') input_email.send_keys(credential['user_name']) input_password = browser_driver.find_element_by_css_selector('input[name = "PASSWORD"]') input_password.send_keys(decrypt(credential['password'], str(uuid.getnode()))) btn_login = browser_driver.find_element_by_css_selector('input[value = "Log on"]') btn_login.click() return browser_driver
def get_all_salaries(city_urls, cities: List[str]) -> Iterable[Dict[str, Any]]: """ Return a dict of city, avg_salary, and, if available, min/max salaries per city.""" browser = Chrome() for url, city in zip(city_urls, cities): print(url) browser.get(url) try: sel_title = 'td.bar-chart-bootstrap-range-label' sel_title2 = 'div.pay-spotlight__pay-value' avg_salary = browser.find_element_by_css_selector( sel_title2).text.strip().strip('$').replace(',', '') salary_range = browser.find_element_by_css_selector(sel_title).text min_salary, max_salary = parse_salary_range(salary_range) result = { 'city': city, 'avg_salary': avg_salary, 'min_salary': min_salary, 'max_salary': max_salary } yield result except NoSuchElementException: sel_title = 'div.pay-spotlight__pay-value' avg_salary = browser.find_element_by_css_selector( sel_title).text.strip().strip('$') result = {'city': city, 'avg_salary': avg_salary} yield result
def test_post_count_after_search(): # Uruchomienie przeglądarki Chrome. Ścieżka do chromedrivera # ustawiana automatycznie przez bibliotekę webdriver-manager browser = Chrome(executable_path=ChromeDriverManager().install()) # Otwarcie strony browser.get('https://www.awesome-testing.com/') # Inicjalizacja searchbara i przycisku search search_input = browser.find_element_by_css_selector("input.gsc-input") search_button = browser.find_element_by_css_selector('.gsc-search-button') # Szukanie search_input.send_keys('cypress') search_button.click() # Czekanie na stronę time.sleep(5) # czekamy na posty # Pobranie listy tytułów list_of_post = browser.find_elements(By.CSS_SELECTOR, '.post-title a') # Asercja że lista ma 3 elementy assert len(list_of_post) == 3 # Zamknięcie przeglądarki browser.quit()
def crawl_scholar(title_list, min_sleeping_time=1): browser = Chrome() output = [] browser.get('https://scholar.google.co.kr/') try: for idx1, title in enumerate(title_list): browser.get('https://scholar.google.co.kr/') time.sleep(randint(min_sleeping_time, min_sleeping_time + 3)) search = browser.find_element_by_css_selector('#gs_hdr_tsi') search.clear() search.send_keys(title) #time.sleep(3) search_button = browser.find_element_by_css_selector( '#gs_hdr_tsb > span') search_button.click() #time.sleep(3) try: abstract_table = browser.find_element_by_class_name('gs_rs') abstract = abstract_table.text except: print("Error at title {}: {}".format(idx1, e)) abstract = '' output.append(abstract) except: return output return output
def gather_thumbs(): opt = Options() opt.add_argument( 'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/74.0.3729.169 Safari/537.36') opt.add_argument("--disable-notifications") browser = Chrome(executable_path='chromedriver.exe', options=opt) browser.maximize_window() browser.get(URL) for _ in range(N): browser.find_element_by_tag_name('body').send_keys(Keys.END) sleep(1) try: browser.find_element_by_css_selector('input.mye4qd').click() sleep(1) except selenium.common.exceptions.ElementNotInteractableException: pass over = browser.find_element_by_css_selector('div.Yu2Dnd').text if over != '': break thumbs_urls = browser.find_elements_by_css_selector('a.mM5pbd') list_urls = [] for href in thumbs_urls: action_chains = ActionChains(browser) action_chains.context_click(href).perform() list_urls.append(href.get_attribute('href')) if len(list_urls) % 30 == 0: print('collecting links ...', len(list_urls)) browser.close() print('------------------------THUMBS collected. Total: ', len(list_urls)) return list_urls
def test_post_count_after_search(): # Uruchomienie przeglądarki Chrome. Ścieżka do chromedrivera # ustawiana automatycznie przez bibliotekę webdriver-manager browser = Chrome(executable_path=ChromeDriverManager().install()) # Otwarcie strony browser.get('https://www.awesome-testing.com/') # Inicjalizacja searchbara i przycisku search search_input = browser.find_element_by_css_selector("input.gsc-input") search_button = browser.find_element_by_css_selector('.gsc-search-button') # Szukanie search_input.send_keys('cypress') search_button.click() # Czekanie na stronę wait = WebDriverWait(browser, 10) grey_status_bar = (By.CLASS_NAME, 'status-msg-body') wait.until(expected_conditions.visibility_of_element_located(grey_status_bar)) # Pobranie listy tytułów list_of_post = browser.find_elements(By.CSS_SELECTOR, '.post-title a') # Asercja że lista ma 3 elementy assert len(list_of_post) == 3 # Zamknięcie przeglądarki browser.quit()
def additionalCrawl2(): # 增加爬取信息公开数据 target = 'http://www.csrc.gov.cn/pub/zjhpublic/' driver = Chrome(executable_path="/usr/local/bin/chromedriver", options=CHROME_OPS) driver.get(target) # iframe = driver.find_element_by_css_selector('iframe#divNoObjectFound') driver.switch_to.frame("DataList") page_source = driver.page_source # 爬取20页的数据 for page in range(20): bs = BeautifulSoup( page_source, 'lxml', ) all_row = bs.find_all('div', class_="row") for row in all_row: res_map = {} href = row.find('a').get('href') title = row.find('a').get_text() date = row.find('li', class_="fbrq").get('title') res_map["title"] = title res_map["date"] = format_date(date) res_map[ "url"] = 'http://www.csrc.gov.cn/pub/zjhpublic/' + href.replace( '../', '') TARGET_LISTS.append(res_map) if page < 20: driver.find_element_by_css_selector('span.nav_go_next').click() page_source = driver.page_source driver.close()
def google_distance(search_tag_list): google_distance_list = [] # 建立Chrome物件 driver = Chrome('./chromedriver') url = 'https://www.google.com.tw/maps/dir///@24.9554014,121.2384829,17z/data=!4m2!4m1!3e0?hl=zh-TW' for start in search_tag_list: for end in search_tag_list: if start == end: pass else: driver.get(url) time.sleep(1) driver.find_element_by_xpath( '//*[@id="sb_ifc50"]/input').send_keys( start.replace('\n', '')) # --- 輸入起點 time.sleep(1) driver.find_element_by_xpath( '//*[@id="sb_ifc51"]/input').send_keys( end.replace('\n', '')) # --- 輸入目的 time.sleep(2) driver.find_element_by_xpath( '//*[@id="sb_ifc51"]/input').send_keys(Keys.ENTER) time.sleep(5) driver.find_element_by_css_selector( 'span#section-directions-trip-details-msg-0').click() time.sleep(3) soup = BeautifulSoup(driver.page_source, 'html.parser') a = soup.select('h1[class="section-trip-summary-title"]') c = soup.select('h2[class="directions-mode-group-title"]') # print(c) address = [d.text for d in c] # print(b) for i in a: # print(i.text.split('-')[0]) # time.sleep(1) save_data_dict = { '出發地點': start.replace('\n', ''), '目的地': end.replace('\n', ''), '所需時間': i.text.split('-')[0], '路徑': address } save_data_js = json.dumps(save_data_dict, ensure_ascii=False) # print(save_data_js) google_distance_list.append(save_data_js) driver.close() return google_distance_list
def test_imdb_search(): driver = Chrome( "/Users/andymckerrow/Helio/QAPoint/Python-Selenium-UI-Tests/_drivers/chromedriver" ) driver.get("https://www.imdb.com/") driver.find_element_by_id('navbar-query').send_keys('badlands') driver.find_element_by_css_selector('[class*="magnifyingglass"]').click() assert driver.title == 'Find - IMDb'
def open_the_browser(self): options = ChromeOptions() options.headless = False # -> FALSE IF YOU WANT TO SEE THE BROWSER BROWSING driver = Chrome(options=options, executable_path=ChromeDriverManager().install()) driver.get(self.WEB_LINKS["football"]) sleep(3) driver.find_element_by_css_selector('#close-cc-bar').click() return driver
def main(): driver = Chrome("./chromedriver") driver.get("https://accounts.google.com/signin/v2/identifier?service=youtube&uilel=3&passive=true&continue=https" "%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Dzh-TW%26next" "%3Dhttps%253A%252F%252Fwww.youtube.com%252F%253Fgl%253DTW%2526tab%253Dw1&hl=zh-TW&ec=65620&flowName" "=GlifWebSignIn&flowEntry=ServiceLogin") driver.find_element_by_id("identifierId").send_keys("djflsdflkl") driver.find_element_by_css_selector("span.RveJvd.snByac").click()
def main(): driver = Chrome("./chromedriver") url = "https://www.ptt.cc/bbs/index.html" driver.get(url) board = driver.find_element_by_css_selector("div.board-name") board.click() driver.find_element_by_css_selector("button.btn-big").click()
def test_get_secret(self, browser: webdriver.Chrome, link): browser.get(link) textarea = browser.find_element_by_css_selector("textarea.textarea") answer = math.log(int(time.time())) textarea.send_keys(str(answer)) submit = browser.find_element_by_css_selector("button.submit-submission") submit.click() result = browser.find_element_by_css_selector("pre.smart-hints__hint").text assert result == "Correct!", result
def take_screenshots(): driver = Chrome() driver.get('http://127.0.0.1:7000') driver.set_window_size(1260, 800) driver.save_screenshot('main.png') driver.find_element_by_css_selector('.feed-post').click() time.sleep(5) # Wait for MathJax to do its thing. driver.save_screenshot('post.png') driver.close()
def __init__(self, gym, login, password): Chrome.__init__(self, self.executable_path, options=self.options) Chrome.implicitly_wait(self, self.time_to_wait) Chrome.get(self, self.ff_website) Chrome.find_element_by_css_selector( self, self.gym_selector).click() # Expand gym location dropdown Chrome.find_element_by_link_text(self, gym).click() # Choose gym Chrome.find_element_by_id(self, 'requiredtxtUserName').send_keys(login) Chrome.find_element_by_id(self, 'requiredtxtPassword').send_keys(password) Chrome.find_element_by_id(self, 'btnLogin').click() # Login
def test_saysth(): browser = Browser() # 用户打开了主页 browser.get(index_url) left_bar = browser.find_element_by_class_name('layout-aside-left') # 用户看见了登录按键 login_button = left_bar.find_element_by_class_name('q-card-main') assert '登录' in login_button.text # 用户点击了登录 login_button.click() sleep(1) # 用户登录了网站 assert try_login_with(browser, TESTING_CARD_ID, TESTING_PASSWORD) # 用户点击了"广场" browser.find_element_by_xpath( '//*[@id="q-app"]/div/aside/div[1]/div[2]/div[3]/div[2]/div').click() # 用户点击了"+"按钮 browser.find_element_by_css_selector( 'div.layout-page-container.transition-generic > main > div:nth-child(1) > div.z-fixed.fixed-bottom-right > button' ).click() sleep(1) # 用户输入了一些话 browser.find_element_by_xpath( '/html/body/div[3]/div/div/div[2]/div[1]/div/div/div/div/a/div[2]/div[2]/textarea' ).send_keys('测试') # 用户点击了发布 browser.find_element_by_xpath( '/html/body/div[3]/div/div/div[1]/div/button[2]/span').click() sleep(1) # 用户看见了自己的帖子 the_post = browser.find_element_by_css_selector( '#q-app > div > div.layout-page-container.transition-generic > main > div:nth-child(1) > div.q-infinite-scroll > div.q-infinite-scroll-content > div:nth-child(3)' ) post_text = the_post.text assert '测试' in post_text # 用户点击了删除 the_post.find_element_by_tag_name('button').click() sleep(1) browser.find_element_by_class_name( 'modal-buttons').find_elements_by_tag_name('button')[1].click() sleep(1) # 用户不再能看见了自己的帖子了 try: the_post = browser.find_element_by_css_selector( '#q-app > div > div.layout-page-container.transition-generic > main > div:nth-child(1) > div.q-infinite-scroll > div.q-infinite-scroll-content > div:nth-child(3)' ) except: pass else: post_text = the_post.text assert '测试' not in post_text browser.close()
def claim_prize(driver: webdriver.Chrome, email_addr: str): try: claim_prize_button = WebDriverWait(driver, 5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, "div.prize-overlay button.main-button"))) button_click(driver, claim_prize_button) except: return -1 # Opens another tab time.sleep(2) driver.switch_to.window(driver.window_handles[-1]) time.sleep(2) name_input = WebDriverWait(driver, 10).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, "input[name='name']"))) name_input.send_keys(get_random_word()) time.sleep(0.5) email_input = driver.find_element_by_css_selector("input[name='email']") email_input.send_keys(email_addr) time.sleep(0.5) region_select = driver.find_element_by_css_selector( "select[name='gameServer']") button_click(driver, region_select) time.sleep(0.5) euw = driver.find_element_by_css_selector( "option[value='Europe West (EUW)']") euw.click() time.sleep(0.5) checkmark = driver.find_element_by_class_name("mc-checkmark") button_click(driver, checkmark) time.sleep(0.5) submit_button = driver.find_element_by_css_selector("input.custom-button") button_click(driver, submit_button) save_email(email_addr) time.sleep(5) return 1
def homework(): print("取得します") options = ChromeOptions() options.add_argument('--headless') driver = Chrome(options=options) driver.get('https://hcms.hosei.ac.jp/') print("取得中...") WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located) driver.find_element_by_xpath("//*[@id='username']").send_keys( os.environ['ID']) driver.find_element_by_xpath("//*[@id='password']").send_keys( os.environ['PASS']) driver.find_element_by_css_selector( "button.form-element.form-button").click() driver.implicitly_wait(10) print("ログイン完了") iframe = driver.find_element_by_xpath( "//*[@id='Main46dc03dbxaccex4553x867cxd1f69a7656b1']") driver.switch_to.frame(iframe) WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located) time.sleep(1) try: size = len( driver.find_element_by_xpath("/html/body/div/form/table/tbody"). find_elements_by_tag_name('tr')) except NoSuchElementException: print('エラー') return list1 = [[0 for i in range(2)] for j in range(size - 1)] print("課題取得中") for i in range(size - 1): name = driver.find_element_by_xpath( "/html/body/div/form/table/tbody/tr[" + str(i + 2) + "]/td[4]").text list1[i][0] = name due = driver.find_element_by_xpath( "/html/body/div/form/table/tbody/tr[" + str(i + 2) + "]/td[3]").text list1[i][1] = due print("取得完了") temp = max(list1[:], key=len) Max = max(temp, key=len) headers = ["教科", "期限"] for i in range(len(list1)): leftTime = math.ceil( (datetime.datetime.strptime(list1[i][1], "%Y/%m/%d %H:%M") - datetime.datetime.now()).seconds / 3600) if leftTime == 2: text = list1[i][0] + "あと" + str(leftTime) + "時間ですよ" slack.chat.post_message('URZM8NGHY', str(text), as_user=True) driver.quit()
def test_imdb_badlandsreleasedate(): driver = Chrome( "/Users/andymckerrow/Helio/QAPoint/Python-Selenium-UI-Tests/_drivers/chromedriver" ) driver.get("https://www.imdb.com/") driver.find_element_by_id('navbar-query').send_keys('badlands') driver.find_element_by_css_selector('[class*="magnifyingglass"]').click() driver.find_element_by_link_text('Badlands').click() assert 'Badlands (1973) - IMDb' + '1973' assert 'Badlands (1973) - IMDB' + 'PG' assert 'Badlands (1973) - IMDB' + '1hr 34min' assert 'Badlands (1973) - IMDB' + 'Crime' assert 'Badlands (1973) - IMDB' + 'Drama' assert 'Badlands (1973) - IMDB' + 'Terrence Malick'
class CloudFoundry(object): def __init__(self, headless=False): options = ChromeOptions() options.add_argument("disable-extensions") options.add_argument("incognito") if headless: options.add_argument("headless") if os.name == 'nt': path_to_chrome = str(Path('./chromedriver.exe').relative_to('.')) else: path_to_chrome = str(Path('./chromedriver').absolute()) self.browser = Chrome(path_to_chrome, options=options) def logging_in(self, login, password): self.browser.get('https://login.cf.eu1.mindsphere.io/passcode') # self.browser.get('https://academy2.eu1.mindsphere.io') # self.browser.get('https://eo3codev.eu1.mindsphere.io') # self.browser.get('https://svcusr.cn1.mindsphere-in.cn') # self.browser.get('https://svcdev.cn1.mindsphere-in.cn/') # self.browser.get('https://svcuopt.cn1.mindsphere-in.cn') # self.browser.get('https://kosfprod.eu1.mindsphere.io/') self.wait_until_css_element_object_found('#username') self.browser.find_element_by_css_selector('#username').send_keys(login) # self.browser.find_element_by_css_selector('#emailaddress').send_keys(login) self.browser.find_element_by_css_selector('#password').send_keys( password) self.browser.find_element_by_css_selector('.btn-yellow').submit() def get_temporary_passcode(self): self.wait_until_css_element_object_found('h2') self.temporary_passcode = self.browser.find_element_by_css_selector( 'h2').text self.browser.quit() def highlight_background_by_css(self, css_selector): self.browser.execute_script('window.document.querySelector(\'' + css_selector + '\').style.backgroundColor= "yellow"') self.browser.execute_script('window.document.querySelector(\'' + css_selector + '\').scrollIntoView') # input('Press Enter') el_object = self.browser.find_element_by_css_selector(css_selector) ActionChains(self.browser).move_to_element(el_object).perform() sleep(1) def highlight_background_by_id(self, id_element): self.browser.execute_script('window.document.getElementById(\'' + id_element + '\').style.backgroundColor= "yellow"') self.browser.execute_script('window.document.getElementById(\'' + id_element + '\').scrollIntoView') # input('Press Enter') el_object = self.browser.find_element_by_id(id) ActionChains(self.browser).move_to_element(el_object).perform() sleep(1) def wait_until_css_element_object_found(self, css_param, wait_time=10): wait = WebDriverWait(self.browser, wait_time) wait.until( EC.visibility_of_element_located((By.CSS_SELECTOR, css_param)))
def scrape_company_data(companies): """Scrape data from Glassdoor on companies in list.""" browser = Chrome() url = "https://www.glassdoor.com/Reviews/index.htm" browser.get(url) final_data = [] sleep(23) for company in companies: try: sel = "input#KeywordSearch.keyword" search_bar = browser.find_element_by_css_selector(sel) search_bar.send_keys(company) search_bar.send_keys(Keys.ENTER) sleep(4) if len(browser.window_handles) > 1: tab_1, tab_2 = browser.window_handles browser.switch_to.window(tab_1) browser.close() browser.switch_to.window(tab_2) sel = "a.tightAll.h2" company_link = browser.find_element_by_css_selector(sel) company_link.click() sleep(4) sel = "a.eiCell.cell.reviews" reviews_link = browser.find_element_by_css_selector(sel) reviews_link.click() sleep(4) temp_stats = [company] stats = get_stats(browser) for stat in stats: temp_stats.append(stat) print(temp_stats) final_data.append(temp_stats) browser.get(url) except Exception as e: print(e) print('error with ', company) url = "https://www.glassdoor.com/Reviews/index.htm" browser.get(url) return pd.DataFrame( final_data, columns=['Company', 'Rating', 'Employee Recommended', 'CEO Approval'])
def main(): excel_df = pd.read_excel('challenge.xlsx', sheet_name='Sheet1') excel_data = excel_df.to_dict(orient='records') driver = Chrome() driver.get('http://www.rpachallenge.com/') start_button = driver.find_element_by_tag_name('button') start_button.click() for item in excel_data: first_name_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelFirstName"]') last_name_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelLastName"]') company_name_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelCompanyName"]') role_in_company_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelRole"]') address_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelAddress"]') email_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelEmail"]') phone_number_input = driver.find_element_by_css_selector('input[ng-reflect-name="labelPhone"]') submit_button = driver.find_element_by_css_selector('input[type="submit"]') form_inputs = [first_name_input, last_name_input, company_name_input, role_in_company_input, address_input, email_input, phone_number_input] for index, (key, value) in enumerate(item.items()): form_inputs[index].send_keys(value) submit_button.click() time.sleep(5) driver.close()
def check_element_exist(driver: webdriver.Chrome, path: str, by: str = 'xpath') -> bool: try: if by == 'xpath': driver.find_element_by_xpath(path) elif by == 'css': driver.find_element_by_css_selector(path) elif by == 'id': driver.find_element(By.ID, path) else: logger.info(f"Unable to check element using '{by}'") except NoSuchElementException: return False return True
def get_baidu_hot(self): """ :return: 返回百度热搜词条列表,每次20条 """ option = ChromeOptions() option.add_argument("--headless") # 隐藏游览器 option.add_argument("--no-sandbox") option.add_argument("--disable-gpu") option.add_argument("--disable-dev-shm-usage") # browser = Chrome(options=option, executable_path=self.Chrome_drive_path) browser = Chrome(options=option) url = self.url browser.get(url) # 找到展开按钮对象 but = browser.find_element_by_css_selector(self.but_selector) # 点击加载更多 but.click() # 爬虫与反爬,模拟人等待1秒 time.sleep(1) # 找到热搜标签 c = browser.find_elements_by_xpath(self.label_xpath) # 获取标签内容 context = [i.text for i in c] browser.close() return context
def get_baidu_hot(): """ :return:返回百度疫情热搜 """ option = ChromeOptions() # 创建谷歌浏览器实例 option.add_argument("--headless") # 隐藏浏览器 option.add_argument("--no-sandbox") d = int(time.strftime("%d", time.localtime())) - 1 # 应对 more_btn 地址的变化 url = "https://voice.baidu.com/act/virussearch/virussearch?from=osari_map&tab=0&infomore=1" browser = Chrome(options=option, executable_path="chromedriver.exe") browser.get(url) # 找到展开按钮 more_btn = browser.find_element_by_css_selector( '#ptab-0 > div > div.VirusHot_1-5-4_32AY4F.VirusHot_1-5-4_2RnRvg > section > div') # more_btn = browser.find_element_by_css_selector('#ptab-0 > div > div.VirusHot_1-5-%d'%(d)+'_32AY4F.VirusHot_1-5-%d'%(d)+'_2RnRvg > section > div') more_btn.click() time.sleep(1) # 等待1秒 # 找到热搜标签 infos = browser.find_elements_by_xpath('//*[@id="ptab-0"]/div/div[2]/section/a/div/span[2]') context = [i.text for i in infos] return context
def get_baidu_hot(): """ :return: 百度疫情热搜 """ option = ChromeOptions() option.add_argument("--headless") # 隐藏浏览器 option.add_argument("--no-sandbox") url = "https://voice.baidu.com/act/virussearch/virussearch?from=osari_map&tab=0&infomore=1" browser = Chrome(options=option) browser.get(url) # print(browser.page_source) but = browser.find_element_by_css_selector( '#ptab-0 > div > div.VirusHot_1-5-4_32AY4F.VirusHot_1-5-4_2RnRvg > section > div' ) # 点击展开 but.click() # 等待3s time.sleep(3) c = browser.find_elements_by_xpath( '//*[@id="ptab-0"]/div/div[2]/section/a/div/span[2]') context = [i.text for i in c] # for i in c: # print(i.text) # browser.close() return context
def get_baidu_hot(): """ :return:返回百度热搜词 """ url = "https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_aladin_banner#tab1" # 得到展开全部按钮的selector selector = "#ptab-1 > div.Virus_1-1-300_2SKAfr > div.Common_1-1-300_3lDRV2 > span" xpath = "//*[@id=\"ptab-1\"]/div[3]/div/div[2]/a/div" # 得到标题的Xpath # 隐藏每次打开浏览器的操作 option = ChromeOptions() option.add_argument("--headless") # 隐藏浏览器 option.add_argument("--no-sandbox") # 彻底停用沙箱 # 创建浏览器对象 brower = Chrome(options=option) brower.get(url) # print(brower.page_source) # 获取到网页源码 button = brower.find_element_by_css_selector(selector) button.click() # 点击展开 time.sleep(1) # 等待1秒 xpath_text = brower.find_elements_by_xpath(xpath=xpath) context = [i.text for i in xpath_text] # print(context) brower.close() return context
class Greenhouse: FIRST_NAME = 'first_name' LAST_NAME = 'last_name' EMAIL = 'email' PHONE = 'phone' def __init__(self): self.driver = Chrome() self.data = { 'first_name': '', 'last_name': '', 'email': '', 'phone': '' } def get(self, url): self.driver.get(url) def enter_field(self, id, value): input_text = self.driver.find_element_by_id(id) input_text.send_keys(value) def enter_by_attribute(self, attribute, value): e = self.driver.find_element_by_css_selector( "[autocomplete='custom-question-linkedin-profile']") e.send_keys('LinkedIN')
def get_host_search(): from selenium.webdriver import Chrome, ChromeOptions # google chrome的无头模式,即不打开浏览器,后台自动加载数据,可以大幅度提高爬虫效率, option = ChromeOptions() option.add_argument('--headless') # 一藏浏览器,可以大幅度提高爬虫效率 option.add_argument('--no-sandbox') # 部署的时候linux还会要求参数,需要禁用sandbox broswer = Chrome('driver_file/chromedriver', options=option) url = 'https://voice.baidu.com/act/virussearch/virussearch/' broswer.get(url) # print(broswer.page_source) more = broswer.find_element_by_css_selector( '#ptab-0 > div > div.VirusHot_1-5-6_32AY4F.VirusHot_1-5-6_2RnRvg > section > div' ) # print(more) more.click() # more.click() # 点击展开 time.sleep(1) # 等待一定时间 data_lst = broswer.find_elements_by_xpath( '//*[@id="ptab-0"]/div/div[1]/section/a/div/span[2]') # list # for item in lst: # print(item.text) # print(data_lst) context = [item.text for item in data_lst] # 在关闭浏览器之前获取,否则报session失效 broswer.close() # 关闭浏览器 # print(context) return context
def get_baidu_hot(): """ :return: 返回百度疫情热搜 """ option = ChromeOptions() # 创建谷歌浏览器实例 option.add_argument("--headless") # 隐藏浏览器 option.add_argument('--no-sandbox') url = "https://voice.baidu.com/act/virussearch/virussearch?from=osari_map&tab=0&infomore=1" browser = Chrome(options=option, executable_path="./chromedriver.exe") browser.get(url) # print(browser.page_source) # 找到展开按钮 # browser.switch_to_frame(browser.find_element_by_xpath("//iframe[contains(@id,'x-URS-iframe')]")) # dl = browser.find_element_by_xpath('//*[@id="main"]/div/div/section/div[2]/div/div[2]/section/div') # dl.click() # but = browser.find_element_by_css_selector\ # ('#main > div > div > section > VirusSearch_1-5-6_2K0WZ5 > div > div.VirusHot_1-5-6_32AY4F.VirusHot_1-5-6_2RnRvg > section') but = browser.find_element_by_css_selector( '#main > div > div > section > div.VirusSearch_1-5-6_3ae6cO >' ' #ptab-0 > div > div.VirusHot_1-5-6_32AY4F.VirusHot_1-5-6_2RnRvg > section>div' ) print(but) but.click() time.sleep(1) # 找到热搜标签 # c = browser.find_elements_by_xpath('//*[@id="main"]/div/div/section/div[2]/div/div[2]/section/a/div/span[2]') c = browser.find_elements_by_xpath( '//*[@id="main"]/div/div/section/div[2]/*[@id="ptab-0"]/div/div[1]/section/a/div/span[2]' ) print(c) context = [i.text for i in c] # 获取标签内容 print(context) return context
def get_selected_text(url: str, selectors: Selectors, driver: Chrome, logger: Logger) -> Optional[dict]: current_url = None selector = None try: driver.get(url) WebDriverWait(driver, 10).until( expected_conditions.presence_of_element_located( (By.CSS_SELECTOR, 'body'))) current_url = driver.current_url selector = selectors.get_selector(current_url) WebDriverWait(driver, 10).until( expected_conditions.presence_of_element_located( (By.CSS_SELECTOR, selector))) selected_text = driver.find_element_by_css_selector(selector).text return { 'url': current_url, 'selector': selector, 'selected_text': selected_text, } except TimeoutException as e: logger.error( json.dumps( { 'event': 'detect_related_url:get_selected_text:timeout', 'details': { 'url': current_url or url, 'selector': selector, 'error': e.__str__() } }, ensure_ascii=False)) return None
class SeleniumTestCase(LiveServerTestCase): """ Base class for Selenium tests. Allows tests to be written independently of which browser they're going to be run in. """ @classmethod def appium_command_executor(cls): """ Get the command executor URL for iOS simulator testing """ if hasattr(cls, '_appium_executor'): return cls._appium_executor # Get the address iWebDriver will connect to address = None try: address = socket.gethostbyname(socket.gethostname()) except: # Use default address defined below pass # If we don't have an address we should use localhost if not address: address = '127.0.0.1' port = 4723 cls._appium_executor = "".join(["http://", address, ":", str(port), '/wd/hub']) return cls._appium_executor @classmethod def setUpClass(cls): # Create the screenshots directory if it doesn't exist yet screenshot_dir = settings.SELENIUM_SCREENSHOT_DIR if screenshot_dir and not os.path.exists(screenshot_dir): os.makedirs(screenshot_dir) super(SeleniumTestCase, cls).setUpClass() @classmethod def tearDownClass(cls): super(SeleniumTestCase, cls).tearDownClass() def setUp(self): """ Start a new browser instance for each test """ self._screenshot_number = 1 self.browser = os.getenv('SELENIUM_BROWSER', settings.SELENIUM_DEFAULT_BROWSER) if os.getenv('SELENIUM_HOST'): self.sel = self.sauce_labs_driver() elif self.browser == 'firefox': self.sel = Firefox() elif self.browser == 'htmlunit': self.sel = RemoteWebDriver(desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS) elif self.browser in ['ios', 'ipad', 'ipod', 'iphone']: capabilities = { 'app': 'safari', 'browserName': '', 'device': 'iPhone Simulator', 'os': 'iOS 6.1' } self.sel = RemoteWebDriver(command_executor=self.appium_command_executor(), desired_capabilities=capabilities) elif self.browser == 'opera': self.sel = RemoteWebDriver(desired_capabilities=DesiredCapabilities.OPERA) elif self.browser == 'iexplore': self.sel = RemoteWebDriver(desired_capabilities=DesiredCapabilities.INTERNETEXPLORER) elif self.browser == 'phantomjs': self.sel = PhantomJS(service_args=['--debug=true', '--webdriver-loglevel=DEBUG']) elif self.browser == 'safari': # requires a Safari extension to be built from source and installed self.sel = RemoteWebDriver(desired_capabilities=DesiredCapabilities.SAFARI) else: self.sel = Chrome() self.sel.set_page_load_timeout(settings.SELENIUM_PAGE_LOAD_TIMEOUT) # Give the browser a little time; Firefox throws random errors if you # hit it too soon time.sleep(1) def tearDown(self): # Check to see if an exception was raised during the test info = sys.exc_info() passed = info[0] is None if not passed: # Want to see what went wrong self.screenshot() self.report_status(passed) if hasattr(self, 'sel'): self.sel.quit() super(SeleniumTestCase, self).tearDown() # ~~~~~~~~~~~~~~~~~~~~~~~~~ Selenium operations ~~~~~~~~~~~~~~~~~~~~~~~~~~ def assert_hidden(self, selector): element = self.wait_for_element(selector) msg = "'%s' should not be visible" % selector assert not element.is_displayed(), msg def assert_not_present(self, selector): assert_raises(NoSuchElementException, self.sel.find_element_by_css_selector, selector) def assert_not_visible(self, selector): """ Ok if it's either missing or hidden """ try: element = self.sel.find_element_by_css_selector(selector) except NoSuchElementException: return msg = "'%s' should not be visible" % selector assert not element.is_displayed(), msg def assert_text_not_in_element(self, selector, text): """ Verify that the specified element does not contain certain text """ msg = "'%s' should not contain the text '%s'" % (selector, text) content = self.sel.find_element_by_css_selector(selector).text assert text not in content, msg def assert_visible(self, selector): element = self.wait_for_element(selector) msg = "'%s' should be visible" % selector assert element.is_displayed(), msg def audit_accessibility(self): """ Check for accessibility violations using the JavaScript library from Chrome's Developer Tools. """ # First add the library to the page script = '' for line in ADD_ACCESSIBILITY_SCRIPT.splitlines(): script += line.strip() self.sel.execute_script(script) # Wait for the script to finish loading self.wait_for_condition('return axs.AuditRule.specs.videoWithoutCaptions !== "undefined";') # Now run the audit and inspect the results self.sel.execute_script('axs_audit_results = axs.Audit.run();') failed = self.sel.execute_script('return axs_audit_results.some(function (element, index, array) { return element.result === "FAIL" });') if failed: report = self.sel.execute_script('return axs.Audit.createReport(axs_audit_results);') raise self.failureException(report) def click(self, selector): """ Click the element matching the selector (and retry if it isn't visible or clickable yet) """ element = self.wait_for_element(selector) element_was_clicked = lambda driver: lambda_click(element) msg = "The element matching '%s' should be clickable" % selector Wait(self.sel).until(element_was_clicked, msg) return element def click_link_with_text(self, text): link_is_present = lambda driver: driver.find_element_by_link_text(text) msg = "A link with text '%s' should be present" % text link = Wait(self.sel).until(link_is_present, msg) link.click() return link def click_link_with_xpath(self, xpath): link_is_present = lambda driver: driver.find_element_by_xpath(xpath) msg = "A link with xpath '%s' should be present" % xpath link = Wait(self.sel).until(link_is_present, msg) link.click() return link def enter_text(self, selector, value): field = self.wait_for_element(selector) field.send_keys(value) self.screenshot() return field def enter_text_via_xpath(self, xpath, value): field = self.wait_for_xpath(xpath) field.send_keys(value) self.screenshot() return field def get(self, relative_url): self.sel.get('%s%s' % (self.live_server_url, relative_url)) self.screenshot() def screenshot(self): if hasattr(self, 'sauce_user_name'): # Sauce Labs is taking screenshots for us return if not hasattr(self, 'browser') or self.browser == 'htmlunit': # Can't take screenshots return screenshot_dir = settings.SELENIUM_SCREENSHOT_DIR if not screenshot_dir: return name = "%s_%d.png" % (self._testMethodName, self._screenshot_number) path = os.path.join(screenshot_dir, name) self.sel.get_screenshot_as_file(path) self._screenshot_number += 1 def select_by_text(self, selector, text): select = Select(self.wait_for_element(selector)) select.select_by_visible_text(text) self.screenshot() return select def select_by_value(self, selector, value): select = Select(self.wait_for_element(selector)) select.select_by_value(value) self.screenshot() return select def select_text(self, selector, start=0, end=-1): """ Selects the specified text range of the element matching the provided selector by simulating a mouse down, programmatically selecting the text, and then simulating a mouse up. Doesn't yet work on IE < 9 or iOS. Doesn't support nested markup either. """ if not hasattr(self, 'select_text_template'): template = '' for line in SELECT_TEXT_SOURCE.splitlines(): template += line.strip() self.select_text_template = template script = self.select_text_template % (selector, start, end) self.sel.execute_script(script) self.screenshot() def wait_for_background_color(self, selector, color_string): color = Color.from_string(color_string) correct_color = lambda driver: Color.from_string(driver.find_element_by_css_selector(selector).value_of_css_property("background-color")) == color msg = "The color of '%s' should be %s" % (selector, color_string) Wait(self.sel).until(correct_color, msg) self.screenshot() def wait_for_condition(self, return_statement, msg=None): """Wait until the provided JavaScript expression returns true. Note: for this to work, the expression must include the "return" keyword, not just the expression to be evaluated.""" condition_is_true = lambda driver: driver.execute_script(return_statement) if not msg: msg = '"{}" never became true'.format(return_statement) Wait(self.sel).until(condition_is_true, msg) def wait_for_element(self, selector): element_is_present = lambda driver: driver.find_element_by_css_selector(selector) msg = "An element matching '%s' should be on the page" % selector element = Wait(self.sel).until(element_is_present, msg) self.screenshot() return element def wait_for_text(self, text): text_is_present = lambda driver: text in driver.page_source msg = "The text '%s' should be present on the page" % text Wait(self.sel).until(text_is_present, msg) self.screenshot() def wait_for_xpath(self, xpath): element_is_present = lambda driver: driver.find_element_by_xpath(xpath) msg = "An element matching '%s' should be on the page" % xpath element = Wait(self.sel).until(element_is_present, msg) self.screenshot() return element def wait_until_element_contains(self, selector, text): """ Wait until the specified element contains certain text """ text_contained = lambda driver: text in driver.find_element_by_css_selector(selector).text msg = "'%s' should contain the text '%s'" % (selector, text) Wait(self.sel).until(text_contained, msg) self.screenshot() def wait_until_hidden(self, selector): """ Wait until the element matching the selector is hidden """ element = self.wait_for_element(selector) element_is_hidden = lambda driver: not element.is_displayed() msg = "The element matching '%s' should not be visible" % selector Wait(self.sel).until(element_is_hidden, msg) self.screenshot() return element def wait_until_not_present(self, selector): """ Wait until the element matching the selector is gone from page """ element_is_present = lambda driver: driver.find_element_by_css_selector(selector) msg = "There should not be an element matching '%s'" % selector Wait(self.sel).until_not(element_is_present, msg) self.screenshot() def wait_until_not_visible(self, selector): """ Wait until the element matching the selector is either hidden or removed from the page """ element_is_visible = lambda driver: driver.find_element_by_css_selector(selector).is_displayed() msg = "The element matching '%s' should not be visible" % selector Wait(self.sel).until_not(element_is_visible, msg) self.screenshot() def wait_until_option_added(self, selector, option_text): """ Wait until the specified select option appears; the entire select widget may be replaced in the process """ end_time = time.time() + settings.SELENIUM_TIMEOUT while True: try: select = Select(self.sel.find_element_by_css_selector(selector)) for option in select.options: if option.text == option_text: return option except (NoSuchElementException, StaleElementReferenceException): pass time.sleep(settings.SELENIUM_POLL_FREQUENCY) if time.time() > end_time: break raise TimeoutException("Select option should have been added") def wait_until_option_disabled(self, selector, option_text): """ Wait until the specified select option is disabled; the entire select widget may be replaced in the process """ end_time = time.time() + settings.SELENIUM_TIMEOUT while True: try: select = Select(self.sel.find_element_by_css_selector(selector)) for option in select.options: if option.text == option_text and not option.is_enabled(): return option except (NoSuchElementException, StaleElementReferenceException): pass time.sleep(settings.SELENIUM_POLL_FREQUENCY) if time.time() > end_time: break raise TimeoutException("Select option should have been disabled") def wait_until_property_equals(self, selector, name, value): """ Wait until the specified CSS property of the element matching the provided selector matches the expected value """ value_is_correct = lambda driver: driver.find_element_by_css_selector(selector).value_of_css_property(name) == value msg = "The %s CSS property of '%s' should be %s" % (name, selector, value) Wait(self.sel).until(value_is_correct, msg) self.screenshot() def wait_until_offscreen(self, selector): """ Wait until the element matching the provided selector has been moved offscreen (deliberately, not just scrolled out of view) """ end_time = time.time() + settings.SELENIUM_TIMEOUT while True: try: element = self.sel.find_element_by_css_selector(selector) location = element.location size = element.size if location["y"] + size["height"] <= 0: self.screenshot() return True if location["x"] + size["width"] <= 0: self.screenshot() return True except (NoSuchElementException, StaleElementReferenceException): pass time.sleep(settings.SELENIUM_POLL_FREQUENCY) if time.time() > end_time: break raise TimeoutException("'%s' should be offscreen" % selector) def wait_until_onscreen(self, selector): """ Wait until the element matching the provided selector has been moved into the viewable page """ end_time = time.time() + settings.SELENIUM_TIMEOUT while True: try: element = self.sel.find_element_by_css_selector(selector) location = element.location if location["x"] >= 0 and location["y"] >= 0: self.screenshot() return True except (NoSuchElementException, StaleElementReferenceException): pass time.sleep(settings.SELENIUM_POLL_FREQUENCY) if time.time() > end_time: break raise TimeoutException("'%s' should be offscreen" % selector) def wait_until_property_less_than(self, selector, name, value): """ Wait until the specified CSS property of the element matching the provided selector is less than a certain value. Ignores any non-integer suffixes like 'px'. """ value_is_correct = lambda driver: int(re.match(r'([\d-]+)', driver.find_element_by_css_selector(selector).value_of_css_property(name)).group(1)) < value msg = "The %s CSS property of '%s' should be less than %s" % (name, selector, value) Wait(self.sel).until(value_is_correct, msg) self.screenshot() def wait_until_visible(self, selector): """ Wait until the element matching the selector is visible """ element = self.wait_for_element(selector) element_is_visible = lambda driver: element.is_displayed() msg = "The element matching '%s' should be visible" % selector Wait(self.sel).until(element_is_visible, msg) return element # ~~~~~~~~~~~~~~~~~~~~~~~~~ Sauce Labs support ~~~~~~~~~~~~~~~~~~~~~~~~~~ def sauce_labs_driver(self): """ Configure the Selenium driver to use Sauce Labs """ host = os.getenv("SELENIUM_HOST", "ondemand.saucelabs.com") port = os.getenv("SELENIUM_PORT", "80") executor = "".join(["http://", host, ":", port, '/wd/hub']) platform = os.getenv("SELENIUM_PLATFORM", "Windows 7") version = os.getenv("SELENIUM_VERSION", "") self.sauce_user_name = os.getenv("SAUCE_USER_NAME") self.sauce_api_key = os.getenv("SAUCE_API_KEY") tunnel_id = os.getenv("SAUCE_TUNNEL_ID", "") build_number = os.getenv('BUILD_NUMBER') job_name = os.getenv('JOB_NAME') # http://code.google.com/p/selenium/wiki/DesiredCapabilities # https://saucelabs.com/docs/additional-config#desired-capabilities caps = { 'accessKey': self.sauce_api_key, 'capture-html': True, 'browserName': self.browser, 'javascriptEnabled': True, 'name': self.id(), 'platform': platform, 'username': self.sauce_user_name, 'version': version, } if build_number and job_name: caps['build'] = '{} #{}'.format(job_name, build_number) if tunnel_id: caps['tunnel-identifier'] = tunnel_id if settings.SELENIUM_SAUCE_VERSION: caps['selenium-version'] = settings.SELENIUM_SAUCE_VERSION remote = webdriver.Remote(command_executor=executor, desired_capabilities=caps) # Store the Sauce session ID to output later for Jenkins integration # See https://saucelabs.com/jenkins/5 for details sauce_sessions.append('SauceOnDemandSessionID={} job-name={}'.format(remote.session_id, self.id())) return remote def report_status(self, passed): """Report to Sauce Labs whether or not the test passed, so that can be reflected in their UI.""" if not hasattr(self, 'sauce_user_name'): # Not using Sauce Labs for this test return url_pattern = 'http://{}:{}@saucelabs.com/rest/v1/{}/jobs/{}' url = url_pattern.format(self.sauce_user_name, self.sauce_api_key, self.sauce_user_name, self.sel.session_id) body_content = json.dumps({"passed": passed}) headers = { 'Content-Type': 'application/json', } response = requests.put(url, body_content, headers=headers) return response.status_code == 200
def get_job(browser: WebDriver) -> str: rows = browser.find_elements_by_css_selector('tr.table_row') for row in rows: cells = row.find_elements_by_tag_name('td') for i, c in enumerate(cells): if c.text == 'AUTOMATION': tran_run_id= cells[i+10].text return tran_run_id browser.get('https://eit1-i.svcs.hp.com/cds/') # Site-Minder url USER1=input("Please enter the User Name:") PASSWORD1 = getpass.getpass("Password: "******"USER"]') email.send_keys(USER1) password = browser.find_element_by_css_selector('input[name="PASSWORD"]') password.send_keys(PASSWORD1) logon = browser.find_element_by_css_selector('input.btn.btn-primary') logon.click() browser.get('https://eit1-i.svcs.hp.com/cds/LoadLdssAsync') load_option = browser.find_element_by_id('UploadOptionList') load_option.send_keys('Validate Only') file_selector = browser.find_element_by_id('ldssfile') file_selector.send_keys(r'C:\Users\tangjing\Desktop\Auto-Reg\Automation.xlsx')
downloadldss.click() else: time.sleep(10) i = i - 1 print("Will wait 10x" + i + "second(s)") if i < 1: break print("you can check the validation result now!") if __name__ == "__main__": browser = Chrome() tran_name = "Test for CDS48 - 100 users contacts - 16" with open(".pass") as f: credential = json.load(f) browser.get("https://eit1-i.svcs.hp.com/cds/") email = browser.find_element_by_css_selector('input[name= "USER"]') email.send_keys(credential["user_name"]) password = browser.find_element_by_css_selector('input[name = "PASSWORD"]') password.send_keys(credential["password"]) Login = browser.find_element_by_css_selector('input[value = "Log on"]') Login.click() find_a_job(browser, tran_name)
class AutomatorMixin(object): class UnexpectedSituation(Exception): pass data_property_class = None def __init__(self, steps, data_args=[]): self.steps = steps self.data = self.data_property_class(*data_args) def run(self): options = ChromeOptions() options.add_argument('--test-type') self.driver = Chrome(chrome_options=options) self.perform_steps() self.driver.close() def find_element(self, selector): LOG.info('finding selector "%s"' % selector) return self.driver.find_element_by_css_selector(selector) @property def action_method_lookup(self): return self.get_action_method__lookup() def get_action_method__lookup(self): return { 'click': self.perform_click, 'fill_form': self.perform_fill_form, 'select_drop_down': self.perform_select_drop_down, } def get_css_selector(self, action): return action.get('css_selector') def get_action_value(self, action): if 'value' in action: value = action['value'] elif 'property' in action: property_name = action['property'] value = getattr(self.data, property_name) else: raise AutomatorMixin.UnexpectedSituation('Cannot find key "property" or "value"') return value def perform_steps(self): for step in self.steps: if 'url' in step: self.driver.get(step['url']) if 'actions' in step: self.perform_actions(step['actions']) def perform_actions(self, actions): for action in actions: action_method = self.action_method_lookup[action['type']] action_method(action) def perform_click(self, action): selector = self.get_css_selector(action) if selector: self.find_element(selector).click() return # Find by id. This will be needed when people use "." in their id names. Such as kfc's survey css_id = action['id_selector'] LOG.info(css_id) self.driver.find_element_by_id(css_id).click() def perform_fill_form(self, action): selector = self.get_css_selector(action) value = self.get_action_value(action) self.find_element(selector).send_keys(value) def perform_select_drop_down(self, action): selector = self.get_css_selector(action) value = self.get_action_value(action) Select(self.find_element(selector)).select_by_value(value)
def order(shop=None, browser=None, lego_set=None, order_list=None, username=None, password=None): """ Fill in LEGO parts to be ordered in LEGO's customer service shop. """ from selenium.common.exceptions import NoSuchElementException from selenium.webdriver import Chrome, Firefox from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.select import Select from selenium.webdriver.support.wait import WebDriverWait from time import sleep order_list = order_list.split(',') shop_url = 'https://wwwsecure.us.lego.com/{shop}/service/replacementparts/order'.format(shop=shop) browser = Chrome() if browser == 'chrome' else Firefox() browser.get(shop_url) print("Sometimes they ask you to fill in a survey.") try: survey_layer = browser.find_element_by_id('ipeL104230') survey_layer.send_keys(Keys.ESCAPE) except NoSuchElementException: print("We're lucky, no survey on the LEGO shop today!") print("They want to know how old we are.") age_field = browser.find_element_by_name('rpAgeAndCountryAgeField') age_field.send_keys('55') age_field.send_keys(Keys.RETURN) if username and password: print("Let's log in with LEGO ID {user}.".format(user=username)) login_link = browser.find_element_by_css_selector('.legoid .links > a') login_link.click() browser.switch_to.frame('legoid-iframe') user_input = browser.find_element_by_id('fieldUsername') user_input.click() user_input.send_keys(username) passwd_input = browser.find_element_by_id('fieldPassword') passwd_input.click() passwd_input.send_keys(password) login_button = browser.find_element_by_id('buttonSubmitLogin') login_button.click() browser.switch_to.default_content() sleep(4) # seconds wait = WebDriverWait(browser, 5) print("We need to tell them which set we want to buy parts from: {lego_set}".format(lego_set=lego_set)) setno_field = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, '.product-search input[ng-model=productNumber]'))) setno_field.send_keys(lego_set) setno_field.send_keys(Keys.RETURN) print("Let's scroll the page down a bit, so we can see things better.") browser.execute_script("window.scroll(0, 750);") print("That's gonna be crazy: {count} elements to order! Let's rock.".format(count=len(order_list))) element_field = wait.until(EC.element_to_be_clickable( (By.ID, 'element-filter'))) print() for brick in order_list: part_no, quantity = brick.split(':') print("- {qty}x #{pn} ".format(qty=quantity, pn=part_no), end='') element_field.clear() element_field.send_keys(part_no) element_field.send_keys(Keys.RETURN) sleep(.3) # seconds try: add_button = browser.find_element_by_css_selector('.element-details + button') add_button.click() sleep(.2) # seconds except NoSuchElementException: print("OOOPS! No LEGO part with that number found in set #{set}. :-(".format(set=lego_set)) continue try: warn_msg = browser.find_element_by_css_selector('.alert-warning .sold-out-info') if warn_msg.is_displayed(): print("NOTE: item out of stock. ", end='') add_anyway = browser.find_element_by_css_selector('.alert-warning + .clearfix button') add_anyway.click() except NoSuchElementException: pass amount_select = browser.find_elements_by_css_selector('.bag-item select')[-1] amount_select.send_keys(quantity) amount_select.send_keys(Keys.TAB) selected = Select(amount_select).first_selected_option if quantity != selected.text: print("WARNING: Could not select desired quantity. {} != {}".format(quantity, selected.text)) else: print() browser.execute_script("window.scroll(0, 0);") print() print("We're done. You can finalize your order now. Thanks for watching!")