def click_menu_option_by_visible_text(self, menu_locator, list_of_menu_options): """ Performs support move_to_element action on every link <support...> contained in menu_locator if its visible text matches any of the names defined in list_of_menu_options and clicks on the last matching link. :param menu_locator: :param list_of_menu_options: """ menu_options = self.driver.find_elements(*menu_locator) actions = ActionChains(self.driver) menu_index = 0 expected_option = None for option in menu_options: if menu_index >= len(list_of_menu_options): break if expected_option is None: expected_option = list_of_menu_options[menu_index].strip() if option.get_attribute('title') == expected_option or option.get_attribute( 'text') == expected_option or option.text == expected_option: actions.move_to_element(option) menu_index += 1 expected_option = None actions.click() actions.perform()
def test_tamplate(self): ''' Test a situation when unlogged user tries to download a file ''' item_to_download = WebDriverWait(self.driver, 10).until( ec.visibility_of_element_located((By.CLASS_NAME, 'ent-title'))) action = ActionChains(self.driver) action.move_to_element(item_to_download) action.click(item_to_download) action.perform() time.sleep(5) download_button = self.driver.find_elements_by_class_name('download') download_button_1 = download_button[0] download_button_2 = download_button[1] action = ActionChains(self.driver) action.move_to_element(download_button_2) action.click(download_button_2) action.perform() time.sleep(8) #Alert message try: alert_message = WebDriverWait(self.driver, 10).until( ec.visibility_of_element_located((By.CLASS_NAME, 'xw-hdr-text'))) finally: print ('oops')
def _select_case(self, role, case): """Select the test case. """ # select the case elem = Select(self._browser.find_element_by_id('select-dut')) elem.select_by_value(str(role)) time.sleep(1) checkbox = None wait_until(lambda: self._browser.find_elements_by_css_selector('.tree-node .tree-title') and True) elems = self._browser.find_elements_by_css_selector('.tree-node .tree-title') finder = re.compile(r'.*\b' + case + r'\b') finder_dotted = re.compile(r'.*\b' + case.replace(' ', r'\.') + r'\b') for elem in elems: action_chains = ActionChains(self._browser) action_chains.move_to_element(elem) action_chains.perform() logger.debug(elem.text) if finder.match(elem.text) or finder_dotted.match(elem.text): parent = elem.find_element_by_xpath('..') checkbox = parent.find_element_by_class_name('tree-checkbox') break if not checkbox: time.sleep(5) raise Exception('Failed to find the case') self._browser.execute_script("$('.overview').css('left', '0')") checkbox.click() time.sleep(1) elem = self._browser.find_element_by_id('runTest') elem.click() if not wait_until(lambda: self._browser.find_element_by_id('stopTest') and True, 10): raise Exception('Failed to start test case')
def _select_case(self, suite, case): """Select the test case. """ # select the case elem = Select(self._browser.find_element_by_id('select-dut')) elem.select_by_value(str(suite)) time.sleep(1) checkbox = None elems = self._browser.find_elements_by_css_selector('.tree-node .tree-title') for elem in elems: action_chains = ActionChains(self._browser) action_chains.move_to_element(elem) action_chains.perform() logger.debug(elem.text) if elem.text.startswith(case): parent = elem.find_element_by_xpath('..') checkbox = parent.find_element_by_class_name('tree-checkbox') break if not checkbox: time.sleep(5) raise Exception('Failed to find the case') checkbox.click() time.sleep(1) elem = self._browser.find_element_by_id('runTest') elem.click() if not self.wait_until(lambda: self._browser.find_element_by_id('stopTest') and True, 10): raise Exception('Failed to start test case')
def _test_reorder_file_bar(self, page): page.add_file([x for x in FILES if x.name == 'test.jpg'][0]) WebDriverWait(page.driver, 3).until( ec.visibility_of_element_located( ( By.CSS_SELECTOR, 'div.grid-canvas div.ui-widget-content.slick-row.odd' ) ) ) ac = ActionChains(page.driver) a = page.driver.find_elements_by_css_selector( 'DIV.container DIV.slick-header.ui-state-default DIV.slick-header-columns.ui-sortable SPAN.slick-column-name' )[3] b = page.driver.find_elements_by_css_selector( 'DIV.container DIV.slick-header.ui-state-default DIV.slick-header-columns.ui-sortable SPAN.slick-column-name' )[0] ac.click_and_hold(a).perform() a_chain = ActionChains(page.driver) a_chain.move_to_element(b).perform() a_chain.release(b).perform() downloads = page.driver.find_element_by_css_selector( 'div.grid-canvas div.ui-widget-content.slick-row.odd DIV.slick-cell.l0.r0' ).text self.assertIn('0', downloads) page.close()
def test_LoginRead(self):#第二种方法,见main里的注释 cdr=self.cdr Url=self.Url cdr.get(Url) #cdr.implicitly_wait(5) WebDriverWait(cdr,10).until(lambda cdr:cdr.find_element_by_xpath(".//*[@id='J_connect']/div[2]/div/div/span/a[2]")) fopen=open(r".\something\username.txt","r") for us in fopen:#------这里是从文件里进行读取 time.sleep(2) cdr.find_element_by_xpath(".//*[@id='J_connect']/div[2]/div/div/span/a[2]").click()#点击登录 WebDriverWait(cdr,10).until(lambda cdr:cdr.find_element_by_id("email_login")) cdr.find_element_by_id("email_login").click()#点击使用邮箱登陆 print cdr.find_element_by_id("email_login").get_attribute("title") #输入用户名密码 time.sleep(2) cdr.find_element_by_id("login_email").send_keys(us) print "登录用户名为:"+us cdr.find_element_by_id("login_password").send_keys("123456") cdr.find_element_by_id("remember_me").click()#去掉记住登陆 checkbox #点击登录按钮 cdr.find_element_by_id("login").click() time.sleep(5) #鼠标移动到 头像旁边的下落箭头上 action=ActionChains(cdr) action.move_to_element(cdr.find_element_by_xpath("//div[@class='tr']/div/span[2]")).perform() #下拉菜单点击 退出帐号 cdr.find_element_by_xpath("//div[@class='tr']/div/span[3]/ul/li[4]/a").click() fopen.close()
def test_basic_functionality(driver, test_file): try: #Test page response by clicking the reset button and applying new code to ace-editor tt.reset_page(driver) tt.update_editor(driver, test_file) ens_elements = driver.find_elements_by_xpath('//*[@class="ens"]') assert (len(ens_elements) > 0) side_script = '''var right = document.getElementById("rightpane"); \ right.style.width = "200px" ''' driver.execute_script(side_script) #Creates graph objects by right clicking on nodes and selecting from menu actions = ActionChains(driver) elements = ['node', 'ens'] for elem in elements: node = driver.find_element_by_xpath('//*[@class="'+elem+'"]') actions = ActionChains(driver) actions.move_to_element(node) actions.context_click() actions.perform() time.sleep(1) actions = ActionChains(driver) menu = driver.find_element_by_xpath('//*[@class="dropdown-menu"]/li[1]') actions.move_to_element(menu) actions.click() actions.perform() time.sleep(0.5) graph_elements = driver.find_elements_by_xpath('//*[@class="graph"]') assert len(graph_elements) > 0 tt.start_stop_sim(driver) time.sleep(1.5) tt.start_stop_sim(driver) time.sleep(0.5) ticker = driver.find_element_by_xpath('//*[@id="ticks_tr"]/td') sim_time = ticker.get_attribute('textContent') assert (float(sim_time) > 0) except Exception as e: #Travis Only: On fail takes screenshot and uploads it to imgur if('TRAVIS' in os.environ): tt.imgur_screenshot(driver) _, _, tb = sys.exc_info() traceback.print_tb(tb) # Fixed format tb_info = traceback.extract_tb(tb) filename, line, func, text = tb_info[-1] print('An error occurred on line {} in statement {}'.format(line, text)) print(str(e)) exit(1)
def stop(): main_window = driver.current_window_handle driver.switch_to_window(main_window) actions = ActionChains(driver) stop = driver.find_element_by_xpath("//span[contains(text(), 'stop')]") actions.move_to_element(stop) actions.click(stop) actions.perform()
def implicit_click(self, item): actions = ActionChains(self._driver) with wait_for_element_visibility(self._driver, item): actions.move_to_element(self._base).click().perform() # It is needed to clean ActionChains instance after each call of preform() actions = ActionChains(self._driver) actions.move_to_element(item).click().perform()
def click(self, element): # Although elements have a click method, it seems to play up, possibly # when browser loses focus. Search for "selenium missing click" to get # an idea of the problem. Most complaints are on IE, but Chrome seems # susceptible as well. The incantation below, with the move operation # before the click, seems to work more reliably. action_chains = ActionChains(self.browser) action_chains.move_to_element(element).click().perform()
def setInputText(self, name, value): textArea = self.workflow_input.find_element_by_xpath( './*[@data-input-name="{0}"]//textarea'.format(name) ) action_chains = ActionChains(self.portal.browser) action_chains.move_to_element(textArea).click().send_keys( Keys.BACK_SPACE*len(textArea.text)+str(value) ).perform()
def do_it(self): mouse_move_to_menu_themes = ActionChains(self.driver) #mouse_move_to_menu_themes.move_to_element(self.menu) mouse_move_to_menu_themes.move_to_element(self.tab) mouse_move_to_menu_themes.move_to_element(self.subitem) mouse_move_to_menu_themes.click(self.subitem) mouse_move_to_menu_themes.perform() time.sleep(5)
def create_rerun(self, course_key): """ Clicks the create rerun link of the course specified by course_key 'Re-run course' link doesn't show up until you mouse over that course in the course listing """ actions = ActionChains(self.browser) button_name = self.browser.find_element_by_css_selector('.rerun-button[href$="' + course_key + '"]') actions.move_to_element(button_name) actions.click(button_name) actions.perform()
def test_example(driver): # Always include driver as a function parameter. # This is the selenium webdriver that will allow # you to interact with the webpage. tt.reset_page(driver) # Most testing_tools functions require driver as an input. # Presses the reset button to start the page fresh. # Usually useful but not always needed. # More documentation on testing_tools can be found # in nengo_gui/testing_tools.py time.sleep(1) # Waits a small amount of time to ensure the page has # time to reset. tt.update_editor(driver,''' import nengo model = nengo.Network() with model: stim = nengo.Node([0]) a = nengo.Ensemble(n_neurons=50, dimensions=1) nengo.Connection(stim, a) ''') # The page will now load this code into the code editor stim = driver.find_element_by_xpath('//*[@class="node"]') a = driver.find_element_by_xpath('//*[@class="ens"]') # Finds the 'stim' and 'a' nodes and saves them as a webElements. action = ActionChains(driver) # ActionChains allow you to link together multiple mouse events # then execute them in that order. action.move_to_element(stim); action.context_click() action.perform() time.sleep(1) # The stim element has now been right clicked. # WARNING: when using ActionChains reinitialize ActionChains # after every .perform() call, it is not clear why but # ActionChains does not seem to reset properly after this call. right_click_menu = driver.find_element_by_xpath('//*[@class="dropdown-menu"]') assert(bool(stim) and bool(a) == True) # Tests if both elements are present. assert(bool(right_click_menu) == True) # Tests if stim has been properly clicked if('TRAVIS' in os.environ): ########## TRAVIS ONLY tt.imgur_screenshot(driver)
def mouse_over_to_element(self, locator, index=0): """ Move the mouse over the selected locator. :param locator: :param index: """ element = self._get_element(locator, index) actions = ActionChains(self.driver) actions.move_to_element(element) actions.perform()
def click_to_tab_link(self, tab_link): mouse_move_to_menu = ActionChains(self.driver) mouse_move_to_menu.move_to_element(tab_link) mouse_move_to_menu.click(tab_link) mouse_move_to_menu.perform() time.sleep(5) WebDriverWait (self.driver, 10).until(ec.title_is(self.driver.title)) current_page_info = {} current_page_info['current_page_title'] = self.driver.title.encode('utf-8') current_page_info['current_url'] = self.driver.current_url return (current_page_info)
def test_Info(self): cdr=self.cdr url=self.URL cdr.get(url) WebDriverWait(cdr,10).until(lambda cdr:cdr.find_element_by_xpath(".//*[@id='J_connect']/div[2]/div/div/span/a[2]")) time.sleep(2) cdr.find_element_by_xpath(".//*[@id='J_connect']/div[2]/div/div/span/a[2]").click()#点击登录 WebDriverWait(cdr,10).until(lambda cdr:cdr.find_element_by_id("email_login")) cdr.find_element_by_id("email_login").click()#点击使用邮箱登陆 print cdr.find_element_by_id("email_login").get_attribute("title") #输入用户名密码 time.sleep(2) cdr.find_element_by_id("login_email").send_keys("*****@*****.**") cdr.find_element_by_id("login_password").send_keys("123456") cdr.find_element_by_id("remember_me").click()#去掉记住登陆 checkbox #点击登录按钮 cdr.find_element_by_id("login").click() time.sleep(5) #鼠标移动到 头像旁边的下落箭头上 action=ActionChains(cdr) action.move_to_element(cdr.find_element_by_xpath("//div[@class='tr']/div/span[2]")).perform() #下拉菜单点击 个人设置 cdr.find_element_by_xpath("//div[@class='tr']/div/span[3]/ul/li[3]/a").click() #点击专家达人认证 标签 time.sleep(3) cdr.find_element_by_xpath("//div[@class='shelfsetul']/ul/li[6]/a").click() #全部选中 topka-个人设置-专家达人认证-擅长领域里的 checkbox #cdr.find_element_by_xpath("//li[@id='goodat_area']/input[1]").click() #使用加复数的 find_elements_by_xpath 全部点击一遍 checkbox,下面一共用了三张方法 for cli in cdr.find_elements_by_xpath("//input[contains(@type,'checkbox')]"):#这个也行"//input[@type='checkbox']" cli.click() #下面是两种方法,基本上这两个方法是等价的 #[cdr.find_element_by_xpath("//li[@id='goodat_area']/input"+'['+str(i)+']').click() for i in range(1,9)] ''' for i in range(1,9): cdr.find_element_by_xpath("//li[@id='goodat_area']/input"+'['+str(i)+']').click() ''' time.sleep(2) #鼠标移动到 头像旁边的下落箭头上 action=ActionChains(cdr) action.move_to_element(cdr.find_element_by_xpath("//div[@class='tr']/div/span[2]")).perform() #下拉菜单点击 退出帐号 cdr.find_element_by_xpath("//div[@class='tr']/div/span[3]/ul/li[4]/a").click() #最后退出浏览器 cdr.quit()
def run(): # Ensure current window is the one in focus main_window = driver.current_window_handle driver.switch_to_window(main_window) actions = ActionChains(driver) # Find run button run = driver.find_element_by_xpath("//span[contains(text(), 'run')]") actions.move_to_element(run) # Click it actions.click(run) actions.perform()
def runTest(self): print("Checking overview page") action_chains = ActionChains(self.driver) status_menu = self.driver.find_element_by_xpath("//ul/li/a[contains(text(),'Status')]") overview_menu = self.driver.find_element_by_xpath("//ul/li/a[contains(text(),'Overview')]") action_chains.move_to_element(status_menu).click(overview_menu).perform() self.assertIn("Overview", self.driver.title) print("Managed to switch to overview page") for i in ["System", "Memory", "Network", "DHCP Leases"]: self.driver.find_element_by_xpath("//fieldset/legend[contains(text(),'" + i + "')]") print(" * overview page contains section " + i)
def runTest(self): print('Checking overview page') action_chains = ActionChains(self.driver) status_menu = self.driver.find_element_by_xpath("//ul/li/a[contains(text(),'Status')]") overview_menu = self.driver.find_element_by_xpath("//ul/li/a[contains(text(),'Overview')]") action_chains.move_to_element(status_menu).click(overview_menu).perform() self.assertIn('Overview', self.driver.title) print('Managed to switch to overview page') for i in [ 'System', 'Memory', 'Network', 'DHCP Leases' ]: self.driver.find_element_by_xpath("//fieldset/legend[contains(text(),'" + i + "')]") print(' * overview page contains section ' + i)
def rule_value(context, value): value_input = context.browser.find_element_by_xpath("//paper-input[@id='metricValue']") actions = ActionChains(context.browser) actions.move_to_element(value_input) actions.click() actions.send_keys(Keys.BACK_SPACE) actions.perform() actions.move_to_element(value_input) actions.click() actions.send_keys("0") actions.perform()
def test_drag_drop(self): print "Reorder site test is commencing." wait = WebDriverWait(self.driver, self.waitTime) self.driver.get(self.url) print "Starting logging in." wait.until(EC.element_to_be_clickable((By.ID, 'login-button'))).click() wait.until( EC.element_to_be_clickable((By.ID, 'weebly-username'))).click() wait.until( EC.element_to_be_clickable((By.ID, 'weebly-password'))).click() Username = self.driver.find_element_by_id('weebly-username') Username.send_keys(self.email) Password = self.driver.find_element_by_id('weebly-password') Password.send_keys(self.password) wait.until(EC.element_to_be_clickable( (By.XPATH, "//form[@id='weebly-login']/p[4]/input"))).click() print "Selecting Store to edit." wait.until(EC.presence_of_element_located((By.LINK_TEXT, "Jon's Site"))) self.driver.find_element_by_link_text("Jon's Site").click() print "Make sure drag and drop elements exist before starting drag and drop." try: self.assertTrue(self.is_element_present(By.XPATH, "//li[2]/div[2]/div/div")) except AssertionError as e: self.verificationErrors.append(str(e)) try: self.assertTrue(self.is_element_present(By.XPATH, "//div[2]/div/h2")) except AssertionError as e: self.verificationErrors.append(str(e)) print "Elements exist. Get first item on lists location." hover_element1 = self.driver.find_element_by_xpath("//div[2]/div/h2") hover_action1 = ActionChains(self.driver) hover_action1.move_to_element(hover_element1).perform() time.sleep(4) print "Deleting the first item on the list." wait.until(EC.element_to_be_clickable((By.XPATH, "//div[3]/div/div/ul/li/div/div[3]/div"))).click() wait.until(EC.element_to_be_clickable((By.XPATH, "//div[3]/div[3]/div/div/span"))).click() print "Exit the editor." wait.until(EC.element_to_be_clickable( (By.XPATH, "//li[@id='more-drop-button']/a/span"))).click() wait.until(EC.element_to_be_clickable( (By.LINK_TEXT, "Exit Editor"))).click() print "Exited the editor" print "Log out" wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Logout")) ).click() print "Logged out!"
def clicketi_click(context, button): """ trying two different ways of clicking a button because sometimes the Chrome driver for no apparent reason misinterprets the offset and size of the button """ try: button.click() except WebDriverException: action_chain = ActionChains(context.browser) action_chain.move_to_element(button) action_chain.click() action_chain.perform()
def drag_element_to(self, element, drag_to, center): '''Drag one element over to another element''' chain = ActionChains(self.browser) chain.move_to_element(element) chain.click_and_hold(element) if center: # move to center of element chain.move_to_element(drag_to) else: # move to offset from top left of element chain.move_to_element_with_offset(drag_to, 2, 2) chain.perform() return chain
def action_elements_events(self, element_menu, drag_divs): action = ActionChains(self.driver) action.move_to_element(element_menu).click(element_menu) action.click_and_hold(drag_divs) action.move_by_offset(35, 35) action.move_by_offset(15, 20) action.move_by_offset(55, 15) action.release() action.perform() event_start = self.driver.find_element_by_xpath("//li[@id = 'event-start']/span[2]").text event_drag = self.driver.find_element_by_xpath("//li[@id='event-drag']/span[2]").text event_stop = self.driver.find_element_by_xpath("//li[@id = 'event-stop']/span[2]").text return event_start, event_drag, event_stop
def _nx4_terminate_session(self, session): """ _nx4_terminat_session() takes a sesion object as an element an termimnates it. This can only be done after _nx4_login() and _nx4_existing_session() """ driver = self.driver session.click() actions = ActionChains(driver) actions.move_to_element(session).context_click().perform() driver.find_element_by_link_text('Terminate session').click()
def answer_problem(self, correctness): """ Answer image problem. """ offset = 25 if correctness == 'correct' else -25 input_selector = ".imageinput [id^='imageinput_'] img" input_element = self.problem_page.q(css=input_selector)[0] chain = ActionChains(self.browser) chain.move_to_element(input_element) chain.move_by_offset(offset, offset) chain.click() chain.perform()
def get_html(url, page): driver = webdriver.Chrome('D:/Program Files (x86)/chromedriver_win32/chromedriver.exe') driver.set_window_size(1920, 1080) # 关键词:性感男人 by URL编码 driver.get(url) time.sleep(5) # 通过Xpath找到More button load_more = driver.find_element_by_xpath('//*[@id="pageMore"]')#baidupic print('gggggggg') a = 0 stop = False; while(True): scroll_num = 0 while (load_more.get_attribute('style')!="visibility: visible;"): driver.execute_script("scrollTo(0,document.body.scrollHeight);") sleep_time = 5 time.sleep(sleep_time) scroll_num += 1 if scroll_num > 10: stop = True break # print('start') # 模拟用户行为点击加载更多按键 if stop: break actions = ActionChains(driver) actions.move_to_element(load_more) actions.click(load_more) actions.perform() driver.execute_script("scrollTo(0,document.body.scrollHeight);") sleep_time = 5 print(sleep_time) time.sleep(sleep_time) print(load_more.get_attribute('style')) a += 1 print(a) html = driver.execute_script("return document.getElementsByTagName('body')[0].innerHTML") driver.close() html = html.encode('UTF-8') print(html) # 将爬到的html写入文件 mkdir(os.path.dirname(OUTPUT_HTML)) with open(OUTPUT_HTML, 'w') as fw: fw.write(html) fw.close print("end") return html
def connect(self, src, dst): """ Return :class:`ConnectionsPage` for connecting `src` to `dst`. """ chain = ActionChains(self.browser) chain.click_and_hold(src.output_port) # Using root rather than input_port since for some reason # even using a negative Y offset can select the parent's input. chain.move_to_element(dst.input_port) chain.release(None) chain.perform() parent, dot, srcname = src.pathname.rpartition(".") parent, dot, dstname = dst.pathname.rpartition(".") editor_id = "ConnectionsFrame-%s" % (parent) editor_id = editor_id.replace(".", "-") return ConnectionsPage(self.browser, self.port, (By.ID, editor_id))
def addUser(name,passwd,confirmpasswd,email,telephone): action_chains = ActionChains(driver) action_chains.move_to_element(driver.find_element_by_link_text("用户管理")).perform() action_chains.click(driver.find_element_by_link_text("注册用户")).perform() driver.find_element_by_id("username").send_keys(name) driver.find_element_by_id("password").send_keys(passwd) driver.find_element_by_id("confirmpassword").send_keys(confirmpasswd) driver.find_element_by_id("email").send_keys(email) driver.find_element_by_id("telephone").send_keys(telephone) driver.find_element_by_name("strPrivilegeName()").click() driver.find_element_by_id("RegisterBut").click() alert = self.driver.switch_to_alert() alert.accept() time.sleep(3)
# driver.find_element_by_xpath("//*[text()='Export']").click() # time.sleep(1) # os.rename('Download/grafana_data_export.csv','Ready/mysql/MySQL Connections.csv') # # MySQL Client Thread Activity csv download # actions=ActionChains(driver) # driver.find_element_by_xpath("//*[text()='MySQL Client Thread Activity']").click() # more=driver.find_element_by_xpath("//*[@id='panel-10']/div/div/div/plugin-component/panel-plugin-graph/grafana-panel/div/div[1]/panel-header/span/span[3]/ul/li[5]/a/span") # export_csv=driver.find_element_by_xpath("//*[@id='panel-10']/div/div/div/plugin-component/panel-plugin-graph/grafana-panel/div/div[1]/panel-header/span/span[3]/ul/li[5]/ul/li[4]/a/span") # actions.move_to_element(more).move_to_element(export_csv).click().perform() # driver.find_element_by_xpath("//*[text()='Export']").click() # time.sleep(1) # os.rename('Download/grafana_data_export.csv','Ready/mysql/MySQL Client Thread Activity.csv') # MySQL Questions csv download actions = ActionChains(driver) driver.find_element_by_xpath("//*[text()='MySQL Questions']").click() more = driver.find_element_by_xpath( "//*[@id='panel-53']/div/div/div/plugin-component/panel-plugin-graph/grafana-panel/div/div[1]/panel-header/span/span[3]/ul/li[5]/a/span" ) export_csv = driver.find_element_by_xpath( "//*[@id='panel-53']/div/div/div/plugin-component/panel-plugin-graph/grafana-panel/div/div[1]/panel-header/span/span[3]/ul/li[5]/ul/li[4]/a/span" ) actions.move_to_element(more).move_to_element(export_csv).click().perform() driver.find_element_by_xpath("//*[text()='Export']").click() time.sleep(1) os.rename('Download/grafana_data_export.csv', 'Ready/mysql/MySQL Questions.csv') # driver.quit()
def runTest(self): driver = self.getDriver() driver.implicitly_wait(30) param = self.param tool = utils driver.refresh() # driver.find_element_by_xpath('//*[@id="_dropdown_popcontainer"]/div/i').click() # driver.find_element_by_xpath('//*[@id="home_header"]//div[text()="UI测试专属"]').click() # driver.find_element_by_xpath('//button[@class="u-button btn__style___37bsb u8c_primary__style___RFibc btn__style___20DQM "]').click() # sleep(2) # 左上方公共节点 driver.find_element_by_class_name('lebra-navbar-left-icon').click() sleep(2) # 进入社交协同 driver.find_element_by_xpath('//*[text()="人力资源"]').click() sleep(2) # 进入一级节点 menu2 = driver.find_element_by_css_selector('span[title="劳动合同"]') actions = ActionChains(driver) actions.move_to_element(menu2) actions.click(menu2) actions.perform() sleep(2) # 进入二级节点 driver.find_element_by_xpath('//li[@title="劳动合同解除"]').click() sleep(2) # 跳转劳动合同签订iframe iframe = driver.find_element_by_id('HRGXFW020040') # # driver.switch_to.frame(iframe) SwitchTo(driver).frame(iframe) sleep(2) # 点击新增按钮 driver.find_element_by_xpath( '//*[@id="flowApprove"]//button[@class="btn btn-primary"]').click( ) sleep(2) # 点击左侧书按钮 driver.find_element_by_xpath( '//span[@class="button level0 switch noline_close"]').click() # 点击二级的左侧树按钮 driver.find_element_by_xpath( '//span[text()="仓储中心-北京"]/ancestor::a/preceding-sibling::span' ).click() # 选择组织信息 driver.find_element_by_xpath( '//span[text()="仓储中心-北京"]/ancestor::a/following-sibling::ul//span[text()="仓储中心-北京"]' ).click() sleep(1) # 搜索框输入信息 driver.find_element_by_xpath('//*[@id="searchVal"]').send_keys( context.Name.random_name) # driver.find_element_by_xpath('//*[@id="searchVal"]').send_keys("戴英") # 点击搜索按钮 driver.find_element_by_xpath('//*[@id="searchBtn"]/span/i[2]').click() # 点击选中第一个 driver.find_element_by_xpath( '//*[@id="staffAllBody"]/div[2]/table/tbody/tr/td[1]/div/div/label' ).click() # 点击确定按钮 driver.find_element_by_xpath( '//*[@id="addSignsDialog"]//button[@class="btn btn-primary"]' ).click() sleep(3) # 输入解除原因 # driver.find_element_by_xpath('//*[@id="edit_201901111404244vjRbIDmR8"]/div/span').click() # driver.find_element_by_xpath('') # 输入经济补偿金 driver.find_element_by_xpath( '//div[@id="eidt_20190111140430sFoT9PAE1X"]//input[@class="u-form-control ui-form-control fl text-right ui-text-left"]' ).send_keys(10000) # 输入补偿金 driver.find_element_by_xpath( '//div[@id="eidt_20190111140431914mpEyXCu"]//input[@class="u-form-control ui-form-control fl text-right ui-text-left"]' ).send_keys(10000) # 点击解除日期按钮 driver.find_element_by_xpath( '//*[@id="edit_20190111140414sRBCMJuXDC"]/div/span[1]').click() driver.find_element_by_xpath( '//*[@id="edit_20190111140414sRBCMJuXDC"]//div[@class="u-date-panel is-visible"]//div[@class="u-date-cell current"]' ).click() # 点击保存按钮 driver.find_element_by_xpath( '//span[text()="保存"]/ancestor::button').click() sleep(3) text = driver.find_element_by_xpath( '//*[@id="templatePanel"]//button/span[text()="编辑"]').text self.assertEqual("编辑", text) # 点击提交按钮 driver.find_element_by_xpath( '//span[text()="提交"]/ancestor::button').click() sleep(2) # 关闭当前页面 driver.switch_to.default_content() sleep(1) driver.find_element_by_xpath( '//*[@id="home_header"]/div/div[3]/ul/li/div').click()
from selenium import webdriver from selenium.webdriver import ActionChains import time driver = webdriver.Chrome(executable_path='chromedriver.exe') driver.get('https://opensource-demo.orangehrmlive.com/') driver.maximize_window() #login using user details driver.find_element_by_id('txtUsername').send_keys('Admin') driver.find_element_by_id('txtPassword').send_keys('admin123') driver.find_element_by_id('btnLogin').click() time.sleep(5) #find all three option on mouse hover admin = driver.find_element_by_id('menu_admin_viewAdminModule') usermgmt = driver.find_element_by_id('menu_admin_UserManagement') user = driver.find_element_by_id('menu_admin_viewSystemUsers') #Create a action chanin object by passing driver object action = ActionChains(driver) #It first move to first option on mouse hover then second then user then click on user action.move_to_element(admin).move_to_element(usermgmt).move_to_element( user).click().perform()
def create_new_classroom(self, course_name, prof_name, prof_email, student_data=None): # Go to "All Events" self.driver.get("http://seminar.minerva.kgi.edu/app/all-events") print('Going to \"All Events\"') WebDriverWait(self.driver, 10).until(EC.title_contains("All Events")) # Click button to create new classroom print(f"Creating new classroom for {course_name}") self.driver.find_element_by_xpath( "//button[text()='Create Classroom']").click() # Check that the new class page has loaded WebDriverWait(self.driver, 30).until( EC.presence_of_element_located( (By.XPATH, "//h2[text()='Class Information']"))) # Session name session_name = f"{course_name} Technical Interview - {student_data.name}" class_name_field = self.driver.find_element_by_xpath( "//input[@class='value-box']") self.driver.execute_script("arguments[0].value = ''", class_name_field) class_name_field.send_keys(session_name) class_name_field.send_keys(Keys.RETURN) print(f"Entered session name: {session_name}") self.class_edit_updated() # Class date date_picker_field = self.driver.find_element_by_xpath( "//input[contains(@class, 'hasDatepicker')]") self.driver.execute_script("arguments[0].value = ''", date_picker_field) date_picker_field.send_keys(student_data.day) date_picker_field.send_keys(Keys.RETURN) print(f'Picking date {student_data.day}') self.class_edit_updated() # Class hour picker parent_locator_time_hour = "//select[@class='date' and @name='hour']" self.driver.find_element_by_xpath( f"{parent_locator_time_hour}").click() hour_value = student_data.time.hour if 0 < student_data.time.hour < 13 else student_data.time.hour - 12 hour_choice = self.driver.find_element_by_xpath( f"{parent_locator_time_hour}/option[@value='{hour_value}']") hour_choice.click() time.sleep(2) WebDriverWait(self.driver, 10).until( EC.element_selection_state_to_be(hour_choice, True)) # Class minute picker parent_locator_time_minute = "//select[@class='date' and @name='minute']" self.driver.find_element_by_xpath( f"{parent_locator_time_minute}").click() minute_choice = self.driver.find_element_by_xpath( f"{parent_locator_time_minute}/option[@value='{student_data.time.minute}']" ) minute_choice.click() time.sleep(2) WebDriverWait(self.driver, 10).until( EC.element_selection_state_to_be(minute_choice, True)) # Class AM/PM picker parent_locator_time_am_pm = "//select[@class='date' and @name='am-pm']" self.driver.find_element_by_xpath( f"{parent_locator_time_am_pm}").click() am_pm_value = "am" if 0 < student_data.time.hour < 12 else "pm" am_pm_choice = self.driver.find_element_by_xpath( f"{parent_locator_time_am_pm}/option[@value='{am_pm_value}']") am_pm_choice.click() time.sleep(2) WebDriverWait(self.driver, 10).until( EC.element_selection_state_to_be(am_pm_choice, True)) print(f"Class time: {student_data.time}") # Click professor field time.sleep(3) print('Picking professor') professor_disp_field = self.driver.find_element_by_css_selector( "span.select2-selection__arrow") actions = ActionChains(self.driver) actions.move_to_element(professor_disp_field).click().perform() # Search for professor and select the right one parent_locator_professor = "//div[@class='form-wrapper teacher-wrapper']" professor_search_field = WebDriverWait(self.driver, 5).until( EC.presence_of_element_located(( By.XPATH, f"{parent_locator_professor}//input[@class='select2-search__field']" ))).send_keys(prof_name) professor_option = WebDriverWait(self.driver, 5).until( EC.presence_of_element_located(( By.XPATH, f"{parent_locator_professor}//li[contains(text(), '{prof_email}')]" ))).click() print(f"Selected Prof: {prof_name}, {prof_email}") # Student picker print('Picking student') parent_locator_student = "//div[@class='form-wrapper students-wrapper']" student_search_field = WebDriverWait(self.driver, 5).until( EC.element_to_be_clickable( (By.XPATH, f"{parent_locator_student}//input"))) student_search_field.click() student_search_field.send_keys(student_data.name) WebDriverWait(self.driver, 5).until( EC.presence_of_element_located(( By.XPATH, f"{parent_locator_student}//li[contains(@class, 'select2-results__option') and contains(text(), '{student_data.email}')]" ))).click() print(f"Selected {student_data.name}") # Enable recording print('Check recording') self.driver.find_element_by_xpath( "//div[@class='form-wrapper is-record-wrapper']//input").click() # Click button to publish class WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable( (By.CSS_SELECTOR, "button.publish-class"))).click() print('Published class') time.sleep(2) return self.driver.current_url
from selenium.webdriver import ActionChains import time browser = webdriver.Chrome( executable_path= "C:\\Users\\Manish\\Downloads\\Pendrive Data\\Python Files\\drivers\\chromedriver.exe" ) browser.maximize_window() browser.get("https://opensource-demo.orangehrmlive.com") browser.find_element("id", "txtUsername").send_keys("Admin") browser.find_element("id", "txtPassword").send_keys("admin123") browser.find_element( "xpath", "/html/body/div[1]/div/div[3]/div[2]/div[2]/form/div[5]/input").click() time.sleep(2) firstLevel = browser.find_element("xpath", "/html/body/div[1]/div[2]/ul/li[1]/a") secondLevel = browser.find_element( "xpath", "/html/body/div[1]/div[2]/ul/li[1]/ul/li[1]/a") thirdLevel = browser.find_element( "xpath", "/html/body/div[1]/div[2]/ul/li[1]/ul/li[1]/ul/li/a") actions = ActionChains(browser) actions.move_to_element(firstLevel).move_to_element( secondLevel).move_to_element(thirdLevel).click().perform() time.sleep(10) browser.quit()
def mouseover(i): action = ActionChains(self.driver) action.move_to_element(lists[i]).perform() time.sleep(3) del action
def test_dragon_drop(self, driver, default_project, session, provider, modifier_key, action): current_browser = driver.desired_capabilities.get('browserName') node_id = default_project.id # Connect addon to node, upload a single test file node = osf_api.get_node(session, node_id=node_id) if provider != 'osfstorage': addon = osf_api.get_user_addon(session, provider) addon_account_id = list(addon['data']['links']['accounts'])[0] osf_api.connect_provider_root_to_node(session, provider, addon_account_id, node_id=node_id) if modifier_key == 'alt': file_name = 'copy_' + find_current_browser(driver) + '_' + provider + '.txt' new_file, metadata = osf_api.upload_fake_file(session=session, node=node, name=file_name, provider=provider) else: file_name = 'move_' + current_browser + '_' + provider + '.txt' new_file, metadata = osf_api.upload_fake_file(session=session, node=node, name=file_name, provider=provider) try: files_page = FilesPage(driver, guid=node_id) files_page.goto() # Find the row that contains the new file source_row = find_row_by_name(driver, provider, new_file) # Find the row with the OSF storage for row in files_page.fangorn_addons: if row.text == 'OSF Storage (United States)': target = row break action_chains = ActionChains(driver) action_chains.reset_actions() if 'chrome' in current_browser: # The sleeps in the following code block are needed for # Chrome's virtual keyboard to work properly if modifier_key == 'alt': action_chains.key_up(Keys.LEFT_ALT).perform() action_chains.key_down(Keys.LEFT_ALT).perform() action_chains.click_and_hold(source_row).perform() time.sleep(1) action_chains.reset_actions() action_chains.move_to_element(target).perform() time.sleep(1) action_chains.reset_actions() action_chains.key_up(Keys.LEFT_ALT).perform() action_chains.key_down(Keys.LEFT_ALT).perform() action_chains.key_up(Keys.ALT).perform() action_chains.key_down(Keys.ALT).perform() action_chains.release(target).perform() time.sleep(1) action_chains.reset_actions() action_chains.key_up(Keys.LEFT_ALT).perform() action_chains.key_up(Keys.ALT).perform() else: action_chains.click_and_hold(source_row).perform() # Chrome -> will highlight multiple rows if you do not sleep here time.sleep(1) action_chains.move_to_element(target).perform() action_chains.reset_actions() action_chains.release(target).perform() else: if modifier_key == 'alt': action_chains.key_down(Keys.LEFT_ALT) action_chains.click_and_hold(source_row) action_chains.move_to_element(target) action_chains.release(target) action_chains.key_up(Keys.LEFT_ALT) action_chains.perform() else: action_chains.drag_and_drop(source_row, target).perform() # Wait for 5 seconds for Copying message to show WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.CLASS_NAME, 'text-muted'))) # Wait a maximum of 20 seconds for Copying message to resolve WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.CLASS_NAME, 'text-muted'))) files_page.goto() origin_file = find_row_by_name(driver, provider, new_file) destination_file = find_row_by_name(driver, 'osf', new_file) if modifier_key == 'alt': # Test for copy assert 'copy' in origin_file.text assert 'copy' in destination_file.text osf_api.delete_file(session, metadata['data']['links']['delete']) else: # Test for move assert origin_file is None assert 'move' in destination_file.text finally: osf_api.delete_addon_files(session, provider, current_browser, guid=node_id)
def runTest(self): driver = self.getDriver() param = self.param tool = utils driver.refresh() # 左上方公共节点 driver.find_element_by_class_name('lebra-navbar-left-icon').click() sleep(1) # 进入财务管理 driver.find_element_by_xpath('//*[text()="人力资源"]').click() sleep(1) # 进入一级节点 menu2 = driver.find_element_by_css_selector('span[title="人力设置"]') actions = ActionChains(driver) actions.move_to_element(menu2) actions.click(menu2) actions.perform() sleep(1) # 进入二级节点 menu3 = driver.find_element_by_css_selector( 'li[class="bottomBar"][title="变动类型"]') actions.move_to_element(menu3) actions.click(menu3) actions.perform() sleep(1) titleName = driver.find_element_by_css_selector( '#home_header > div > div.tab--38iB- > ul > li > p').get_attribute( 'title') assert u"变动类型" in titleName, u"页面源码中不存在该关键字!" sleep(1) iframe = driver.find_element_by_id('HRSZ030020') driver.switch_to.frame(iframe) # 新增 driver.find_element_by_xpath( '//p[text()="入职"]/..//*[text()="新增"]').click() # 点击新增 driver.find_element_by_xpath( '//p[text()="入职"]/parent::div/div//span[text()="新增"]/following-sibling::i' ).click() # 输入编码 num = random.randint(999, 10000) code = "BM{}".format(num) driver.find_element_by_xpath( '//p[text()="入职"]/parent::div/div//span[text()="新增"]/parent::div/following-sibling::div//label[text()="编码"]/following-sibling::div//input' ).send_keys(code) # 点击离职 # 输入名称 num1 = random.randint(999, 10000) name = "BM{}".format(num1) driver.find_element_by_xpath( '//p[text()="入职"]/parent::div/div//span[text()="新增"]/parent::div/following-sibling::div//label[text()="名称"]/following-sibling::div//input' ).send_keys(name) # 点击保存按钮 driver.find_element_by_xpath( '//p[text()="入职"]/parent::div/div//button[2]').click() sleep(2) # 断言 self.assertIn(name, driver.page_source) driver.switch_to.default_content() driver.find_element_by_class_name('u-button').click() sleep(1) driver.find_element_by_class_name('u-dropdown-menu-item').click()
def get_company(self, company_name): nowhandles = self.driver.current_window_handle time.sleep(1) try: self.driver.find_element_by_xpath( '/html/body/div[1]/div/div/div[1]/div[2]/div[2]/div/div[1]/div[2]/div/h3/a').click() except: self.driver.find_element_by_xpath('/html/body/div[1]/div/div/div[1]/div[2]/div[2]/div/div/div/div/div[3]') self.process_browser_window.emit(company_name + '没有查找到该企业信息,请确认该名称是否存在!') self.s += 1 self.success_browser_num.emit(self.s) self.failname_browser_window.emit(company_name) self.n += 1 self.end_browser_num.emit(self.n) return time.sleep(1) self.process_browser_window.emit("已进入%s该企业详情页面,请稍后。。。" % company_name) allhandles = self.driver.window_handles for handles in allhandles: if handles != nowhandles: self.driver.switch_to.window(handles) time.sleep(1) js = "window.scrollTo(0,600)" self.driver.execute_script(js) time.sleep(0.5) # 工商信息表 company_data_1 = '' try: business_content = self.driver.find_elements_by_xpath('/html/body/div[1]/div/div/div[5]/div[1]/div[3]/table/tbody/tr') # 工商信息采集 for cont_1 in business_content: company_title_1 = cont_1.find_element_by_xpath('.//td[1]') try: company_info_1 = cont_1.find_element_by_xpath('.//td[2]') except: company_info_1 = cont_1.find_element_by_xpath('.//td[2]/div[2]/a[1]') try: company_title_2 = cont_1.find_element_by_xpath('.//td[3]') except: pass try: company_info_2 = cont_1.find_element_by_xpath('.//td[4]') except: pass company_data_1 += company_title_1.text + ':' + company_info_1.text + ';' + company_title_2.text + \ ':' + company_info_2.text + '\n' self.process_browser_window.emit(company_name + '--工商信息爬取成功!') company_content_1 = company_data_1 except: self.process_browser_window.emit(company_name + '没有查找到该企业工商信息,请确认该名称是否存在!') self.f += 1 self.fail_browser_num.emit(self.f) self.failname_browser_window.emit(company_name) self.n += 1 self.end_browser_num.emit(self.n) return # 股东信息表 Action = ActionChains(self.driver) element = self.driver.find_element_by_xpath('/html/body/div[1]/div/div/div[4]/div/div/div[1]/a') Action.move_to_element(element).perform() time.sleep(1) company_data_2 = '' try: self.driver.find_element_by_xpath( '/html/body/div[1]/div/div/div[4]/div/div/div[1]/div/a[3]').click() time.sleep(1) shareholder_content = self.driver.find_elements_by_xpath( '/html/body/div[1]/div/div/div[5]/div[1]/div[4]/table/tbody/tr') # 股东信息采集 for cont_2 in shareholder_content: shareholder_info_1 = cont_2.find_element_by_xpath('.//td[2]/div/div[2]/a[1]') shareholder_info_2 = cont_2.find_element_by_xpath('.//td[3]/div/span') shareholder_info_3 = cont_2.find_element_by_xpath('.//td[4]/div/span') shareholder_info_4 = cont_2.find_element_by_xpath('.//td[5]/div/span') company_data_2 += shareholder_info_1.text + ';' + shareholder_info_2.text + ';' + shareholder_info_3.text + '\n' self.process_browser_window.emit(company_name + '--股东信息爬取成功!') company_content_2 = '--股东信息:' + '\n' + '股东-' + '-持股占比-' + '-认缴出资额' + '实际出资额' + '\n' + company_data_2 except: company_content_2 = '--股东信息:' + '\n' + '股东-' + '-持股占比-' + '-认缴出资额' + '实际出资额' + '\n' + company_data_2 self.process_browser_window.emit(company_name + '--股东信息爬取失败,或该公司未有股东信息!') # 公司主要人员信息表 Action.move_to_element(element).perform() time.sleep(1) company_data_3 = '' try: self.driver.find_element_by_xpath( '/html/body/div[1]/div/div/div[4]/div/div/div[1]/div/a[5]').click() time.sleep(1) manager_content = self.driver.find_elements_by_xpath( '/html/body/div[1]/div/div/div[5]/div[1]/div[6]/table/tbody/tr') # 公司主要人员信息采集 for cont_3 in manager_content: manager_info_1 = cont_3.find_element_by_xpath('.//td[2]/div/div[2]/a[1]') manager_info_2 = cont_3.find_element_by_xpath('.//td[3]/div/span') company_data_3 += manager_info_1.text + ';' + manager_info_2.text + '\n' self.process_browser_window.emit(company_name + '--主要人员爬取成功') company_content_3 = '--主要人员信息:' + '\n' + '姓名-' + '-职位' + '\n' + company_data_3 except: company_content_3 = '--主要人员信息:' + '\n' + '姓名-' + '-职位' + '\n' + company_data_3 self.process_browser_window.emit(company_name + '--主要人员爬取失败,或该公司未有主要人员信息。。。') company_content = '----' + company_name + '\n' + company_content_1 + company_content_2 + company_content_3 + '\n' if not os.path.exists(self.generate_data + self.generate_name): open(self.generate_data + self.generate_name, 'a', encoding='utf-8') with open(self.generate_data + self.generate_name, 'a', encoding='utf-8') as cp_file: cp_file.write(company_content) self.process_browser_window.emit(company_name + "--信息保存成功!") self.s += 1 self.success_browser_num.emit(self.s) self.n += 1 self.end_browser_num.emit(self.n) self.driver.close() self.driver.switch_to.window(nowhandles)
from Data import TestData1 as td import EnvConfig as env from ObjectRepo import Locators as loc driver = webdriver.Chrome(env.DriverPATH) driver.maximize_window() driver.implicitly_wait(10) driver.get("https://www.toolsqa.com/selenium-webdriver/mouse-hover-action/") time.sleep(2) mouseHOver_Tut_link = driver.find_element_by_xpath( loc.MOuseHover_Tutorials_Link) ac = ActionChains(driver) ac.move_to_element(mouseHOver_Tut_link) ac.perform() about = driver.find_element_by_xpath(loc.About) ac.move_to_element(about).perform() face_book = driver.find_element_by_xpath(loc.facebook) face_book.click() # bodyOFToolsQA_com = driver.find_element_by_xpath("//body[contains(@class,'post-template')]") # bodyOFToolsQA_com.send_keys(keyboard.PAGE_DOWN) # bodyOFToolsQA_com.send_keys(keyboard.PAGE_DOWN) # # keyboard_AC = ActionChains(driver) # keyboard_AC.key_down(keyboard.CONTROL).send_keys('a').key_up(keyboard.CONTROL).perform() # # keyboard_AC.
def mouse_hover_desktops_menu(self): actions = ActionChains(self._driver) return actions.move_to_element( self._driver.find_element_by_xpath(self._desktops_menu)).perform()
# #第一步:鼠标悬停 # ac.move_to_element() # #第二步:点击动作 # ac.click() # #第三步:右击 # ac.context_click() # #以perform结束 # ac.perform() # #或者以整体去运行 # ac = ActionChains(driver) # ac.move_to_element().click().context_click().perform() #举例子:百度首页,悬停到设置 ac = ActionChains(driver) ele = wait_find_element((By.XPATH, "//a[text()='设置']")) ac.move_to_element(ele).perform() ac.click(wait_find_element((By.XPATH, "//a[text()='高级搜索' ]"))).perform() ''' 链式调用 actionChains 1、每次都是return self 2、perform() run() 作用:用在连续调用,一次运行不同的程序或者函数 :数据库,ORM模型==》链式调用 函数: 1、click() 2、double-click() 3、context_click() 4、click_and_hold() 5、drag_and_drop() move_to_element
from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.Chrome( executable_path="C:\Program Files\Python39\chromedriver") driver.implicitly_wait(20) driver.maximize_window() driver.get('https://mail.ru/') driver.find_element_by_name('login').send_keys('*****@*****.**') driver.find_element_by_xpath('//*[@id="mailbox"]/form[1]/button[1]').click() driver.find_element_by_name('password').send_keys('youth') driver.find_element_by_xpath('//*[@id="mailbox"]/form[1]/button[2]').click() vse_proekti = driver.find_element_by_link_text('Все проекты') moy_mir = driver.find_element_by_link_text('Мой Мир') actions = ActionChains(driver) actions.move_to_element(vse_proekti).move_to_element(moy_mir).click().perform()
def scrape_directory(): from selenium import webdriver from bs4 import BeautifulSoup import pandas as pd from csv import writer import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://www.softwaresuggest.com/all-categories' all_the_apps = [] driver = webdriver.Chrome('/Users/muhammadaqib/Downloads/chromedriver') driver.get(url) soup = BeautifulSoup(driver.page_source, 'lxml') all_categories = soup.find('div', 'mdl-grid compare_row').find_all('a') category_list = [] for category in all_categories: category_list.append([category.text.strip(), category['href']]) for item in category_list: driver.get(item[1]) print('url***', item[1]) soup = BeautifulSoup(driver.page_source, 'lxml') try: check_pager = soup.find('ul', {'id': 'mypager_id'}) except: check_pager = None try: check_more_button = soup.find( 'button', {'class': 'ga_track_vmp_lmb cat_view_more_btn ripple_btn'}) except: check_more_button = None if check_pager: last_page = check_pager.find_all('li')[-1].find('a')['href'].split( '?')[-1].split('=')[-1] for pg_no in range(1, int(last_page) + 1): print(item[1] + '?page=' + str(pg_no)) driver.get(item[1] + '?page=' + str(pg_no)) soup = BeautifulSoup(driver.page_source, 'lxml') apps_on_page = soup.find('div', 'cat_list_append').find_all( 'h3', 'slist_oftware_name') for app_item in apps_on_page: try: driver.get(app_item.find('a')['href']) except: app_url = app_item.find( 'span', 'd-flex align-items-center ga_track_soft_name new_link_onclick' )['onclick'].split('(')[1][1:-11] driver.get(app_url) soup = BeautifulSoup(driver.page_source, 'lxml') print(app_item.text.strip()) title = app_item.text.strip() category = item[0] try: find_app_url = soup.find( 'span', 'ga_track_vwl_comp_d comp_detail_vwb_btn cursor_pointer' )['onclick'] driver.get(find_app_url.split('(')[1][1:-11]) time.sleep(5) url = driver.current_url except: url = driver.current_url url = url.split('/')[2] print(['pagination', title, category, url]) app_info = ['softwaresuggest', title, category, url] with open( '/Users/muhammadaqib/Documents/softwaresuggest.csv', 'a') as f_object: writer_object = writer(f_object) writer_object.writerow(app_info) all_the_apps.append(app_info) print(len(all_the_apps)) if check_more_button: print('CHECK MORE BUTTON') while check_more_button: try: wait = WebDriverWait(driver, 10) accept = wait.until( EC.element_to_be_clickable( (By.XPATH, '//*[@id="cat_list_tab_1"]/div[3]/button'))) actions = ActionChains(driver) actions.move_to_element(accept).click().perform() except: break soup = BeautifulSoup(driver.page_source, 'lxml') apps_on_page = soup.find('div', 'cat_list_append').find_all( 'h3', 'slist_oftware_name') for app_item in apps_on_page: try: driver.get(app_item.find('a')['href']) except: app_url = app_item.find( 'span', 'd-flex align-items-center ga_track_soft_name new_link_onclick' )['onclick'].split('(')[1][1:-11] driver.get(app_url) soup = BeautifulSoup(driver.page_source, 'lxml') print(app_item.text.strip()) title = app_item.text.strip() category = item[0] try: find_app_url = soup.find( 'span', 'ga_track_vwl_comp_d comp_detail_vwb_btn cursor_pointer' )['onclick'] driver.get(find_app_url.split('(')[1][1:-11]) time.sleep(5) url = driver.current_url except: url = driver.current_url url = url.split('/')[2] print(['check more button', title, category, url]) app_info = ['softwaresuggest', title, category, url] with open('/Users/muhammadaqib/Documents/softwaresuggest.csv', 'a') as f_object: writer_object = writer(f_object) writer_object.writerow(app_info) all_the_apps.append(app_info) print(len(all_the_apps)) driver.close()
def affiliation(self, elements, related): for web_site in elements: if web_site == "nature": # print("nature") for page in elements[web_site]: page_content = requests.get(page).content self.soup = BeautifulSoup(page_content, 'html.parser') affi = [ i for i in self.soup.findAll("h2") if "id" in i.attrs if i.attrs["id"] == "affiliations" ][0] unis = [ i.text.strip() for i in affi.findNext("ol").findAll("h3") ] authors = [[ author.findAll("span")[1].text for author in authorlist.findAll("li") ] for authorlist in affi.findNext("ol").findAll("ul")] self.author_affiliations_details.update({page: {}}) for author_s in authors: for author in author_s: self.author_affiliations_details[page][ author] = unis[authors.index(author_s)] self.save_as_csv(self.author_affiliations_details[page], page, related=related) # print(affiliation) pass if web_site == "science": # print("science") for page in elements[web_site]: page_content = requests.get(page).content self.soup = BeautifulSoup(page_content, 'html.parser') self.author_affiliations_details.update({page: {}}) adress_S = { i.find("sup").text: i.text.replace(i.find("sup").text, "") for i in self.soup.findAll("address") } # authors_a_A = [[j.text for j in i.findAll("sup")] for i in self.soup.findAll("li", attrs={"class":"contributor"})] authors = { i.find("span").text.strip(): [adress_S[j.text] for j in i.findAll("sup")] for i in self.soup.findAll( "li", attrs={"class", "contributor"}) if i.find("span") } self.author_affiliations_details.update({page: authors}) self.save_as_csv(self.author_affiliations_details[page], page, related=related) pass if web_site == "nejm": # print("nejm") for page in elements[web_site]: page_content = requests.get(page).content self.soup = BeautifulSoup(page_content, 'html.parser') # print(self.soup.findAll("section")) sec = [ i for i in self.soup.findAll("section") if "id" in i.attrs if i.attrs["id"] == "author_affiliations" ][0] all_d = [ i.find("p").text for i in sec.findAll("div") if "id" in i.attrs ][0] # print(all_d) loc = "/Users/dhaneesh.gk/Projects/own/web_import/extract_it/pages/poc_2/author_metadata/nejm.json" info_nejm = json.loads(open(loc, "r").read()) self.author_affiliations_details.update({page: info_nejm}) self.save_as_csv(self.author_affiliations_details[page], page, related=related) pass if web_site == "ieee": # print("ieee") for page in elements[web_site]: # ch_ieee = webdriver.Chrome(executable_path="/Users/dhaneesh.gk/Projects/own/web_import/extract_it/drivers/chromedriver") ch_ieee = self.chrome_driver ch_ieee.get(page) ch_ieee.maximize_window() # ss = ch_ieee.execute_script("document.querySelectorAll('span')") # print(ss) # affiliations = {page:{}} # time.sleep(10) # WebDriverWait(ch_ieee, 200).until(EC.element_to_be_clickable((By.XPATH,'//a[@aria-label="dismiss cookie message"]'))) # ch_ieee.find_element_by_xpath('//a[@aria-label="dismiss cookie message"]').click() WebDriverWait(ch_ieee, 20).until( EC.element_to_be_clickable( (By.XPATH, "//button[contains(@ng-click,'authors')]/i"))) # ch_ieee.find_element_by_xpath("//button[contains(@ng-click,'authors')]/i").click() a_ex = ch_ieee.find_element_by_xpath( "//section[div[@id='authors-section-container']]/button[contains(@ng-click,'authors')]" ) action = ActionChains(ch_ieee) action.move_to_element(a_ex).click().perform() # a_ex.click() author_ele = ch_ieee.find_elements_by_xpath( '//section[button[contains(@ng-click,"authors")]]//span[@ng-bind-html="::item.name"]' ) author_afi = ch_ieee.find_elements_by_xpath( '//section[button[contains(@ng-click,"authors")]]//div[@ng-bind-html="::item.affiliation"]' ) affiliation_ieee = { i.text: author_afi[author_ele.index(i)].text for i in author_ele } # affiliations[page].update(affiliation_ieee) # print("affiliation_ieee",affiliation_ieee) affiliation_ieee = None if not affiliation_ieee: loc = "/Users/dhaneesh.gk/Projects/own/web_import/extract_it/pages/poc_2/author_metadata/ieee.json" affiliation_ieee = json.loads(open(loc, "r").read()) self.author_affiliations_details.update( {page: affiliation_ieee}) self.save_as_csv(self.author_affiliations_details[page], page, related=related) # time.sleep(200) # pass if web_site == "oup": # print("oup") try: for page in elements[web_site]: # ch_oup = webdriver.Chrome(executable_path="/Users/dhaneesh.gk/Projects/own/web_import/extract_it/drivers/chromedriver") ch_oup = self.chrome_driver ch_oup.get(page) affi_oup = {} eles_oup = ch_oup.find_elements_by_xpath( '//span[@class="al-author-name"]/a') # count = 1 for author_oup_e in eles_oup: author_oup = author_oup_e.text # print(author_oup) affi_d_e = '//div[div[div[@class="info-card-name"][text()="{0}"]]]/div/div[@class="aff"]'.format( author_oup) author_oup_e.click() affi_t = ch_oup.find_element_by_xpath( affi_d_e).text.strip().replace(" ", "") if not affi_t: affi_t = "AGE Research Group, Institute of Neuroscience, Newcastle University, Newcastle upon Tyne, UK" affi_oup.update({author_oup: affi_t}) self.author_affiliations_details.update( {page: affi_oup}) self.save_as_csv( self.author_affiliations_details[page], page, related=related) except Exception: # print("Error in oup affiliations") pass pass if web_site == "academicradiology": # print("academicradiology") for page in elements[web_site]: page_content = requests.get(page).content self.soup = BeautifulSoup(page_content, 'html.parser') affi_aca = {} for i in self.soup.findAll("div", attrs={"class", "author"}): author_acad = [ author.text for author in i.findAll("a") if "class" in author.attrs if "openAuthorLayer" in author.attrs["class"] ][0] affi_aca.update({author_acad: []}) uni = [] for a_i in i.findAll("ul", attrs={"class", "affiliations"}): if not a_i.find("li").text in uni: uni.append(a_i.find("li").text) affi_aca[author_acad] = uni self.author_affiliations_details.update({page: affi_aca}) self.save_as_csv(self.author_affiliations_details[page], page, related=related) # print(affi) # affi = {[author.text for author in i.findAll("a") if "class" in author.attrs if "openAuthorLayer" in author.attrs["class"]][0]:[a_i.find("li").text for a_i in i.findAll("ul",attrs={"class","affiliations"})] for i in self.soup.findAll("div",attrs={"class","author"})} pass
---------------------------- 鼠标动作链 | ---------------------------- from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.PhantomJS(executable_path='./phantomjs') # 获取节点对象 photo = driver.find_element_by_id('photo') # 通过driver创建Action调用链对象 action = ActionChains(driver) # 移动鼠标到指定的节点 action.move_to_element(photo).perform() # 单击指定节点 action.move_to_element(photo).click(photo).perform() # 双击指定节点 action.move_to_element(photo).double_click(photo).perform() # 右击指定节点 action.move_to_element(photo).context_click(photo).perform() # 左键hold住指定节点 action.move_to_element(photo).click_and_hold(photo).perform() # 把photo节点拖拽到next节点 action.drag_and_drop(photo, driver.find_element_by_id('next')).perform()
class Product(Page): ALL_PRODUCT_LINKS = (By.XPATH, "//ul[contains(@class, 'nav-dropdown-default')]//a") PRODUCT_DESCRIPTION_LINK = (By.XPATH, "//li[@id='tab-title-description']//a") PRODUCT_DESCRIPTION_TAB = (By.XPATH, "//li[@id='tab-title-description']") PRODUCT_NAME = (By.CSS_SELECTOR, 'h1.product-title') PRODUCT_PRICE = (By.CSS_SELECTOR, 'p.price span.amount') ADD_TO_CART_BUTTON = (By.CSS_SELECTOR, 'button.single_add_to_cart_button') HOME_BUTTON = (By.CSS_SELECTOR, "div.product-info a[href='https://gettop.us']") HEART_BUTTON = (By.CSS_SELECTOR, "button.wishlist-button") # collect links for all products on the site def open_product_pages(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) return product_links # Verify clicking Logo Icon takes user to Home Page from every Product page def verify_return_to_home_page_from_every_product_pages(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) top_menu = TopMenu(self.driver) for product in product_links: self.open_page(product) top_menu.click_logo_icon() top_menu.verify_home_page() # verify every product has description tab def verify_description(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) for product in product_links: self.open_page(product) self.find_element(*self.PRODUCT_DESCRIPTION_TAB) # verify every product has name def verify_product_name(self, name: str): product_name = self.find_element(*self.PRODUCT_NAME).get_attribute('textContent') assert name in product_name, f'Expected to see {name}, but got {product_name}' # verify fields sale price and original price not empty def verify_price_and_sale_price(self): product_name = self.find_element(*self.PRODUCT_NAME).get_attribute('textContent') product_price = self.find_elements(*self.PRODUCT_PRICE) for _ in range(len(product_price)): assert product_price[_].text != '', \ f'Product price on {product_name} product page is missing' # click add to cart button def click_add_to_cart(self): self.click(*self.ADD_TO_CART_BUTTON) # Verify Home link takes user to Home Page from every Product page def verify_home_link_from_every_product_page(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) top_menu = TopMenu(self.driver) for product in product_links: self.open_product_page(product) self.click(*self.HOME_BUTTON) top_menu.verify_home_page() # User can add correct item to Wishlist, remove item and see a confirmation Pop-up def add_correct_item_to_wishlist(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) for _ in product_links: self.open_product_page(_) # remember product name product_name = self.find_element(*self.PRODUCT_NAME).get_attribute('textContent') # click Heart Icon to add item to Wishlist Page self.actions = ActionChains(self.driver) self.actions.move_to_element(self.find_element(*self.HEART_BUTTON)).click().perform() # click Heart Icon again to go to Wishlist Page current_url = self.driver.current_url self.wait_for_element_clickable(self.HEART_BUTTON) self.click(*self.HEART_BUTTON) # verify product was added to Wishlist with the same name self.wait_for_url_change(current_url) wishlist_page = WishList(self.driver) wishlist_page.verify_wishlist_product_name(product_name) # Remove product from Wishlist and verify Empty Wishlist message wishlist_page.remove_item_from_wishlist() # # return to home page self.open_page() # User can add correct item to Wishlist, see social logos, remove item and see a confirmation Pop-up def verify_wishlist_has_social_logos(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) for _ in product_links: self.open_product_page(_) # remember product name product_name = self.find_element(*self.PRODUCT_NAME).get_attribute('textContent') # click Heart Icon to add item to Wishlist Page self.actions = ActionChains(self.driver) self.actions.move_to_element(self.find_element(*self.HEART_BUTTON)).click().perform() # click Heart Icon again to go to Wishlist Page current_url = self.driver.current_url self.wait_for_element_clickable(self.HEART_BUTTON) self.click(*self.HEART_BUTTON) # verify product was added to Wishlist with the same name self.wait_for_url_change(current_url) wishlist_page = WishList(self.driver) wishlist_page.verify_wishlist_product_name(product_name) # verify User can see social logos wishlist_page.verify_social_logos() # Remove product from Wishlist and verify Empty Wishlist message wishlist_page.remove_item_from_wishlist() # # return to home page self.open_page() # User add correct item to Wishlist, verify User can click on wishlist item and is taken to correct product page def verify_wishlist_correct_link(self): self.wait_for_presence_off_all_elements(self.ALL_PRODUCT_LINKS) product_links = self.grab_href_links_from_a_tags(*self.ALL_PRODUCT_LINKS) for _ in product_links: self.open_product_page(_) # remember product name product_name = self.find_element(*self.PRODUCT_NAME).get_attribute('textContent') # click Heart Icon to add item to Wishlist Page self.actions = ActionChains(self.driver) current_url = self.driver.current_url self.actions.move_to_element(self.find_element(*self.HEART_BUTTON)).click().perform() # click Heart Icon again to go to Wishlist Page self.wait_for_element_clickable(self.HEART_BUTTON) self.click(*self.HEART_BUTTON) self.wait_for_url_change(current_url) # verify product was added to Wishlist with the same name wishlist_page = WishList(self.driver) wishlist_page.verify_wishlist_product_name(product_name) current_url = self.driver.current_url # click on wishlist item link wishlist_page.click_item_link() self.wait_for_url_change(current_url) # verify link takes user to correct item page new_product_name = self.find_element(*self.PRODUCT_NAME).get_attribute('textContent') assert product_name == new_product_name, \ f'Expected to see {product_name}, but got to the page with {new_product_name}' current_url = self.driver.current_url # click Heart Icon again to go to Wishlist Page self.actions = ActionChains(self.driver) self.actions.move_to_element(self.find_element(*self.HEART_BUTTON)).click().perform() self.wait_for_url_change(current_url) # Remove product from Wishlist and verify Empty Wishlist message wishlist_page.remove_item_from_wishlist() # # return to home page self.open_page() # User can click trough multiple product pages by clicking 1, 2 for page number def clicks_through_product_pages_with_1_2(self): pass # User can click trough multiple product pages by clicking > and < def clicks_through_product_pages_with_arrows(self): pass
if os.path.exists(prefixpathname): pass else: os.mkdir(prefixpathname) # driver.find_element_by_xpath("//ul[@id='stock_list']/li[1]").send_keys(Keys.ENTER) # 切换网页,以获取新弹出的网页窗口 for handle in driver.window_handles: driver.switch_to_window(handle) # print('current url:%s'%driver.current_url) time.sleep(1) urldata = driver.find_element_by_xpath("//ul[@id='category_list']") # print('%s'%urldata.text) chain = ActionChains(driver) moveelment = driver.find_element_by_xpath( "//div[@class='search-condition c5 drop-down']/a/div") chain.move_to_element(moveelment).perform() driver.find_element_by_xpath( "//div[@class='search-condition c5 drop-down']/a/div").click() urldata = driver.find_element_by_xpath( "//div[@class='search-condition c5 drop-down']/a/div") # print('%s'%urldata.text) driver.find_element_by_xpath("//ul[@id='category_list']/li[1]/a").click() # 选择需要的项,年报,半年报...等等 # 如果需要下载全部数据,需要点击更多,直到数据全部显示 # while(rslt[0] != rslt[1]): # driver.find_element_by_link_text('更多').click() # #等待网页相应时间 # time.sleep(1) # urldata = driver.find_element_by_xpath("//div[@id='con-div-his-fulltext']/div[@class='stat-right']") # print('%s'%urldata.text)
EC.presence_of_element_located((By.XPATH,'//*[@id="keywords_input"]'))) time.sleep(5) try: elem3.clear() elem3.send_keys("McDonald's") finally: elem3.send_keys(Keys.ARROW_DOWN) elem3.send_keys(Keys.ENTER) time.sleep(2) # Collecting the URLs for listings pages link1 = driver.current_url elem4 = driver.find_element_by_css_selector('a.paginator_item:nth-child(4)') if 'firefox' in driver.capabilities['browserName']: scroll_shim(driver, elem4) actions = ActionChains(driver) actions.move_to_element(elem4) actions.perform() try: elem4.click() except StaleElementReferenceException: pass link2 = driver.current_url driver.quit() # Scrapping the URLs of all the listings of McD in Pune. agent = {"User-Agent":"Mozilla/5.0"} page1_html = requests.get(link1, headers=agent) page1_data = page1_html.content soup1 = BeautifulSoup(page1_data, "lxml") page2_html = requests.get(link2, headers=agent) page2_data = page2_html.content
from selenium.webdriver import ActionChains from selenium.webdriver.support.ui import Select import time driver = webdriver.Chrome( executable_path= r"C:\Users\mushtaq.hussain\PycharmProjects\Selenium\driver\chromedriver.exe" ) driver.maximize_window() driver.get("https://www.ounass.ae/") time.sleep(2) driver.find_element_by_id("onesignal-slidedown-cancel-button").click() time.sleep(2) action = ActionChains(driver) firstLevelMenu = driver.find_element_by_class_name("Popup-iconText") action.move_to_element(firstLevelMenu).perform() time.sleep(2) loginButton = driver.find_element_by_xpath( "//button[contains(text(),'Log In')]") action.move_to_element(loginButton).click().perform() email = driver.find_element_by_class_name("SignInForm-email") email.send_keys("*****@*****.**") password = driver.find_element_by_class_name("PasswordField-password") password.send_keys("majid@123") time.sleep(2) loginButton = driver.find_element_by_xpath( "//button[contains(text(),'Log In')]") loginButton.click() time.sleep(2) driver.find_element_by_class_name("Popup-iconText").click() emailField = driver.find_element_by_class_name("MyAccountPage-link")
result = driver.find_element_by_xpath(input_string) # print(_) return result except BaseException: sleep(0.5) pass # print("Overtime 20 seconds") return None sleep(1) first_image = driver.find_element_by_tag_name("img") # first_image.click() # first_image.send_keys(Keys.END) actions = ActionChains(driver) actions.move_to_element(first_image) for _ in range(100): actions.send_keys(Keys.DOWN) actions.send_keys(Keys.RIGHT) actions.perform() sleep(0.1) sleep(2) # allImages = driver.find_elements(By.TAG_NAME("img")) allImages = driver.find_elements_by_tag_name("img") # print(allImages) for _ in allImages: imageurl = _.get_attribute("src") print(imageurl)
def mouse_hover(self, element): act = ActionChains(self.driver) act.move_to_element(self, element).perform()
driver = webdriver.Chrome(Path.joinpath(Path.cwd().parent, "drivers", "chromedriver")) driver.maximize_window() driver.get("http://www.leafground.com/") driver.find_element_by_xpath("//img[@src='./images/mouseOver.png']").click() time.sleep(2) testleaf_courses = driver.find_element_by_xpath("//a[@class='btnMouse']") actions = ActionChains(driver) actions.move_to_element(testleaf_courses).perform() link_texts = driver.find_elements_by_xpath("//li/a[text()='TestLeaf Courses']/parent::li/ul/li/a") #Print all the links for text in link_texts: print(text.text) #Click any link and handle the alert link_texts[1].click() time.sleep(1) driver.switch_to.alert.accept() time.sleep(2)
from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.Chrome(executable_path="c:\\chromedriver.exe") driver.get("https://www.rahulshettyacademy.com/AutomationPractice/") # for any mouse driven work in web pages like double click, mouse over etc ActionChains class is to be imported # in ActionChains class driver object should be given as an argument to pass it to the object objAction objAction = ActionChains(driver) mouseOverMenu = driver.find_element_by_css_selector("#mousehover") objAction.move_to_element(mouseOverMenu).perform( ) # perform() method to be added any ActionChains class, # otherwise no action will happen mouseOverClick = driver.find_element_by_link_text("Top") objAction.move_to_element(mouseOverClick).click().perform()
import time from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.chrome.options import Options chromeOptions = Options() chromeOptions.add_experimental_option( "prefs", {"download.default_directory": "C:\\Documents"}) driver = webdriver.Chrome( executable_path="E:\Drivers\chromedriver_win32 (2)\chromedriver.exe", chrome_options=chromeOptions) driver.maximize_window() driver.get("http://demo.automationtesting.in/FileDownload.html") textbox = driver.find_element_by_id("pdfbox") driver.execute_script("arguments[0].scrollIntoView();", textbox) textbox.send_keys("Sample selenium code") driver.find_element_by_id("createPdf").click() action = ActionChains(driver) action.move_to_element( driver.find_element_by_css_selector( "a#pdf-link-to-download")).click().perform() time.sleep(5) # driver.close()
def testMemberAdd(self): driver = self.driver conf = self.conf state = conf.state conf.stateChange(driver) driver.implicitly_wait(10) # MM002 添加会员 # 选择运营支撑平台 driver.find_element_by_id('topMenu_1100').click() # 指定元素:会员管理 button = driver.find_element_by_id('left_menu_1210') # 指定元素:菜单 menu = driver.find_element_by_class_name('nav-header') # 鼠标移动到会员管理上 chain = ActionChains(driver) chain.move_to_element(button).perform() driver.implicitly_wait(10) # 指定元素:会员信息维护,并点击操作 driver.find_element_by_xpath( '//li[@id="left_menu_1211"]/a/span').click() chain.move_to_element(menu).perform() time.sleep(1) # 切换至iframe driver.switch_to_frame('contentIframe1211') # 添加会员 if not driver.find_element_by_id('btnAdd').is_displayed(): driver.find_element_by_class_name('open-close').click() time.sleep(0.5) driver.find_element_by_id('btnAdd').click() driver.implicitly_wait(10) # 输入会员名称 member_name = ranEN(8) time.sleep(2) driver.find_element_by_name('name').send_keys(member_name) # 从数据库查推荐人&安置人编号(取最新一条) member = Oradao.sqlDiy( Oradao(), 'select * from MM_MEMBER m where m.company_code=\'' + state + '\' order by m.create_date desc') member_no = member['MEMBER_NO'][0] member_id = member['ID'][0] driver.find_element_by_name('sponsorMemberNo').send_keys(member_no) # 判断是否自动安置 Placement = Oradao.sqlDiy( Oradao(), 'select * from MM_MEMBER_CHANGE c where c.member_id=' + str(member_id) + 'and c.operate_type=50 order by c.create_date desc') len = Placement['ID'].__len__() if len == 0: value = 0 else: value = Placement['NEW_VALUE'][0] if value == 0: driver.find_element_by_name('placementMemberNo').send_keys( member_no) # 输入身份证 if state == 'US': identification = str(ranNo(100000000, 999999999)) else: identification = str(ranNo(400000000000000000, 999999999999999999)) driver.find_element_by_id('sinTaxId').send_keys(identification) # 输入移动电话 mobilePhone = str(ranNo(13500000000, 13799999999)) driver.find_element_by_id('mobilePhone').send_keys(mobilePhone) # 保存 driver.switch_to_default_content() driver.execute_script('scrollTo(0,500)') driver.switch_to_frame('contentIframe1211') driver.find_element_by_id('btnSubmit').click() driver.implicitly_wait(20) # 依次 点击 2个 返回 driver.switch_to_default_content() driver.execute_script('scrollTo(0,0)') driver.switch_to_frame('contentIframe1211') driver.find_element_by_xpath( '//form[@id="inputForm"]/div[1]/div[3]/input[12]').click() driver.switch_to_default_content() driver.execute_script('scrollTo(0,500)') driver.switch_to_frame('contentIframe1211') driver.find_element_by_xpath( '//div[@id="showSaveDiv"]/div/input[5]').click() driver.switch_to_default_content() driver.execute_script('scrollTo(0,0)') driver.switch_to_frame('contentIframe1211') # 新增会员断言 memberNew = Oradao.sqlDiy( Oradao(), 'select * from MM_MEMBER m where m.company_code=\'' + state + '\' order by m.create_date desc') memberNo = memberNew['MEMBER_NO'][0] if not driver.find_element_by_id('btnAdd').is_displayed(): driver.find_element_by_class_name('open-close').click() time.sleep(0.5) driver.find_element_by_name('sp_memberNo_ILIKE').send_keys(memberNo) driver.find_element_by_id('btnSubmit').click() time.sleep(2) # 获取列表会员编号 rsMemberNo = driver.find_elements_by_xpath( '//table[@id="treeTable1"]/tbody/tr/td[2]')[0].text self.assertEquals(rsMemberNo, memberNo)
def float_element(self, target_ele): chain = ActionChains(self.driver) chain.move_to_element(target_ele).perform()
class SeleneElement(with_metaclass(DelegatingMeta, IWebElement)): @property def __delegate__(self): # type: () -> IWebElement return self._locator.find() # todo: is this alias needed? def get_actual_webelement(self): # type: () -> IWebElement return self.__delegate__ # todo: consider removing this method once conditions will be refactored # todo: (currently Condition impl depends on this method) def __call__(self): return self.__delegate__ # todo: or... maybe better will be remove __delegate__, and just use __call_ instead... ? @classmethod def by(cls, by, webdriver, context=None): # type: (Tuple[str, str], IWebDriver, ISearchContext) -> SeleneElement if not context: context = webdriver return SeleneElement(WebDriverWebElementLocator(by, context), webdriver) @classmethod def by_css(cls, css_selector, webdriver, context=None): # type: (str, IWebDriver, ISearchContext) -> SeleneElement if not context: context = webdriver return SeleneElement.by((By.CSS_SELECTOR, css_selector), webdriver, context) @classmethod def by_css_or_by(cls, css_selector_or_by, webdriver, context=None): if not context: context = webdriver return SeleneElement.by(css_or_by_to_by(css_selector_or_by), webdriver, context) # todo: consider renaming webdriver to driver, because actually SeleneDriver also can be put here... def __init__(self, selene_locator, webdriver): # type: (ISeleneWebElementLocator, IWebDriver) -> None self._locator = selene_locator self._webdriver = webdriver self._actions_chains = ActionChains(webdriver) def __str__(self): return self._locator.description def _execute_on_webelement(self, command, condition=be.or_not_to_be): return command(_wait_with_screenshot(self._webdriver, self, condition)) # *** Relative elements *** def element(self, css_selector_or_by): return SeleneElement( InnerWebElementLocator(css_or_by_to_by(css_selector_or_by), self), self._webdriver) s = element find = element # todo: consider making find a separate not-lazy method (not alias) # to be used in such example: s("#element").hover().find(".inner").click() # over: s("#element").hover().element(".inner").click() # todo: should then all action-commands return cached elements by default? # todo: this is an object, it does not find. should we switch from method to "as a property" implementation? def caching(self): return SeleneElement(CachingWebElementLocator(self), self._webdriver) # todo: cached or cache? def cached(self): caching = self.caching() return caching.should(be.in_dom) def all(self, css_selector_or_by): # return SeleneCollection.by_css_or_by(css_selector_or_by, self._webdriver, context=self) return SeleneCollection( InnerListWebElementLocator(css_or_by_to_by(css_selector_or_by), self), self._webdriver) ss = all elements = all find_all = all @property def parent_element(self): return self.element(by.be_parent()) @property def following_sibling(self): return self.element(by.be_following_sibling()) @property def first_child(self): return self.element(by.be_first_child()) # *** Asserts (Explicit waits) *** def should(self, condition, timeout=None): if timeout is None: timeout = config.timeout # todo: implement proper cashing # self._found = wait_for(self, condition, timeout) _wait_with_screenshot(self._webdriver, self, condition, timeout) return self # todo: consider removing some aliases def assure(self, condition, timeout=None): return self.should(condition, timeout) def should_be(self, condition, timeout=None): return self.should(condition, timeout) def should_have(self, condition, timeout=None): return self.should(condition, timeout) def should_not(self, condition, timeout=None): if timeout is None: timeout = config.timeout # todo: implement proper cashing not_condition = not_(condition) _wait_with_screenshot(self._webdriver, self, not_condition, timeout) return self # todo: consider removing some aliases def assure_not(self, condition, timeout=None): return self.should_not(condition, timeout) def should_not_be(self, condition, timeout=None): return self.should_not(condition, timeout) def should_not_have(self, condition, timeout=None): return self.should_not(condition, timeout) # *** Additional actions *** def double_click(self): self._execute_on_webelement( lambda it: self._actions_chains.double_click(it).perform(), condition=be.visible) return self def context_click(self): self._execute_on_webelement( lambda it: self._actions_chains.context_click(it).perform(), condition=be.visible) return self def set(self, new_text_value): def clear_and_send_keys(webelement): webelement.clear() webelement.send_keys(new_text_value) self._execute_on_webelement(clear_and_send_keys, condition=be.visible) return self set_value = set def scroll_to(self): def js_scroll_to(webelement): location = webelement.location self._webdriver.execute_script("window.scrollTo({x},{y});".format( x=location['x'], y=location['y'])) self._execute_on_webelement(js_scroll_to, condition=be.visible) return self def press_enter(self): return self.send_keys(Keys.ENTER) def press_escape(self): return self.send_keys(Keys.ESCAPE) def press_tab(self): return self.send_keys(Keys.TAB) def hover(self): self._execute_on_webelement( lambda it: self._actions_chains.move_to_element(it).perform(), condition=be.visible) return self # *** ISearchContext methods *** def find_elements(self, by=By.ID, value=None): return self._execute_on_webelement( lambda it: it.find_elements(by, value), condition=be.visible) # return self.__delegate__.find_elements(by, value) # todo: remove def find_element(self, by=By.ID, value=None): return self._execute_on_webelement( lambda it: it.find_element(by, value), condition=be.visible) # return self.__delegate__.find_element(by, value) # todo: remove # *** IWebElement methods *** @property def tag_name(self): return self._execute_on_webelement(lambda it: it.tag_name, condition=be.in_dom) @property def text(self): return self._execute_on_webelement(lambda it: it.text, condition=be.visible) def click(self): self._execute_on_webelement(lambda it: it.click(), condition=be.visible) return self # todo: think on: IWebElement#click was supposed to return None def submit(self): self._execute_on_webelement(lambda it: it.submit(), condition=be.visible) return self def clear(self): self._execute_on_webelement(lambda it: it.clear(), condition=be.visible) return self def get_attribute(self, name): return self._execute_on_webelement(lambda it: it.get_attribute(name), condition=be.in_dom) def is_selected(self): return self._execute_on_webelement(lambda it: it.is_selected(), condition=be.visible) def is_enabled(self): return self._execute_on_webelement(lambda it: it.is_enabled(), condition=be.visible) def send_keys(self, *value): self._execute_on_webelement(lambda it: it.send_keys(*value), condition=be.visible) return self # RenderedWebElement Items def is_displayed(self): return self._execute_on_webelement(lambda it: it.is_displayed(), condition=be.in_dom) @property def location_once_scrolled_into_view(self): return self._execute_on_webelement( lambda it: it.location_once_scrolled_into_view, condition=be.visible) @property def size(self): return self._execute_on_webelement(lambda it: it.size, condition=be.visible) def value_of_css_property(self, property_name): return self._execute_on_webelement( lambda it: it.value_of_css_property(property_name), condition=be.in_dom) @property def location(self): return self._execute_on_webelement(lambda it: it.location, condition=be.visible) @property def rect(self): return self._execute_on_webelement(lambda it: it.rect, condition=be.visible) @property def screenshot_as_base64(self): return self._execute_on_webelement( lambda it: it.screenshot_as_base64, condition=be.visible) # todo: or `be.in_dom`? @property def screenshot_as_png(self): return self._execute_on_webelement( lambda it: it.screenshot_as_png, condition=be.visible) # todo: or `be.in_dom`? def screenshot(self, filename): return self._execute_on_webelement( lambda it: it.screenshot(filename), condition=be.visible) # todo: or `be.in_dom`? @property def parent(self): return self._execute_on_webelement( lambda it: it. parent, # todo: should not we return here some Selene entity as search_context? condition=be.in_dom) @property def id(self): return self._execute_on_webelement(lambda it: it.id, condition=be.in_dom)
def add_data(local): driver = webdriver.Chrome( "C://Program Files//chromedriver//chromedriver.exe") # 카카오 지도에 "XX 빵집" 검색 driver.get(f"https://map.kakao.com/") search_box = driver.find_element_by_css_selector("#search\.keyword\.query") search_box.send_keys(f"{local} 빵집") search_box.send_keys(Keys.ENTER) time.sleep(3) links = driver.find_elements_by_css_selector( "#info\.search\.place\.list > li") target = driver.find_element_by_css_selector("#info\.search\.place") banghae = driver.find_element_by_css_selector("#dimmedLayer") for link in links: try: a = link.find_element_by_css_selector( "div.info_item > div.contact.clickArea > a.moreview") a.send_keys(Keys.ENTER) time.sleep(1) driver.switch_to_window(driver.window_handles[1]) # 데이터생성 작업시작 # name 정보수집 name = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div:nth-child(1) > div.place_details > div > h2" ) name_text = name.text # address 정보수집 try: address = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(2) > div > span.txt_address" ) address_text = address.text except: address_text = "" # phone_number 정보수집 try: phone = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div.placeinfo_default.placeinfo_contact > div > div > span > span.txt_contact" ) phone_text = phone.text except: phone_text = "" try: # 영업일 더보기정보 클릭 date_btn = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.location_present > ul > li > a" ) date_btn.send_keys(Keys.ENTER) # business hour 정보수집 business_hours = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.fold_floor > div > ul:nth-child(2)" ) business_hours_text = business_hours.text # 뜬 창 닫기 close_btn = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.fold_floor > div > a" ) close_btn.send_keys(Keys.ENTER) except NoSuchElementException: try: business_hours = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div > ul > li > span" ) business_hours_text = business_hours.text except NoSuchElementException: business_hours_text = "" # 스크롤 내리기 body = driver.find_element_by_css_selector("body") body.send_keys(Keys.PAGE_DOWN) # sub_name 데이터 수집 try: sub_name = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div.placeinfo_default.open_on > div > p" ) sub_name_text = sub_name.text except NoSuchElementException: sub_name_text = "" # menus_list 데이터 수집 menus = driver.find_elements_by_css_selector("ul.list_menu > li") menus_list = [] for menu in menus: if menu.find_element_by_css_selector( "div span.loss_word").text == "": break add = [] add.append( menu.find_element_by_css_selector( "div span.loss_word").text) try: add.append( int( menu.find_element_by_css_selector( "div em.price_menu").text.replace(",", ""))) except: pass menus_list.append(add) # 사진 데이터 수집 try: photo_button = driver.find_element_by_css_selector( "#mArticle > div.cont_photo > div.photo_area > ul > li.size_l > a" ) action = ActionChains(driver) action.move_to_element(photo_button).perform() photo_button.send_keys(Keys.ENTER) urls = [] time.sleep(2) imgs = driver.find_elements_by_css_selector( "ul.list_phtoview > li") for index, img in enumerate(imgs): if index == 3: break link = img.find_element_by_css_selector("a") link.send_keys(Keys.ENTER) time.sleep(1) real_link = driver.find_element_by_css_selector( "#photoViewer > div.layer_body > div.view_photo > div.view_image > img" ) urls.append(real_link.get_attribute("src")) time.sleep(3) chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" random_names = [] for name in range(len(urls)): random_names.append("".join( (random.choice(chars)) for x in range(10))) for index, url in enumerate(urls): # urlretrieve는 다운로드 함수 urllib.request.urlretrieve( url, os.path.join( BASE_DIR, f"uploads/bakery/bread_imgs/{random_names[index]}.jpg", ), ) except: pass # lat,lng 정보수집 driver.get( f"https://www.google.co.kr/maps/@37.053745,125.6553969,5z?hl=ko" ) google_search_box = driver.find_element_by_css_selector( "#searchboxinput") google_search_box.send_keys(name_text) google_search_box.send_keys(Keys.ENTER) time.sleep(3) try: # 검색했는데 바로 상세로 안가고 목록으로 가면 가장 첫번째 목록 클릭 go_to = driver.find_element_by_css_selector( "#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-layout.section-scrollbox.scrollable-y.scrollable-show.section-layout-flex-vertical > div.section-layout.section-scrollbox.scrollable-y.scrollable-show.section-layout-flex-vertical > div:nth-child(1) > div.section-result-content > div.section-result-text-content" ) go_to.send_keys(Keys.ENTER) time.sleep(3) lat_text = float( driver.current_url.split("@")[1].split(",")[0]) lng_text = float( driver.current_url.split("@")[1].split(",")[1]) except: # 목록이 안뜰경우 try: # 상세로 간 경우 ex = driver.find_element_by_css_selector( "#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-hero-header-title > div.section-hero-header-title-top-container > div.section-hero-header-title-description > div:nth-child(1) > h1 > span:nth-child(1)" ) lat_text = float( driver.current_url.split("@")[1].split(",")[0]) lng_text = float( driver.current_url.split("@")[1].split(",")[1]) except: # 검색결과를 찾지 못한경우 lat_text = 0 lng_text = 0 # print( # name_text, # sub_name_text, # address_text, # business_hours_text, # lat_text, # lng_text, # phone_text, # menus_list, # ) try: bakery = models.Bakery.objects.get(name=name_text) except: models.Bakery.objects.create( name=name_text, sub_name=sub_name_text, lat=lat_text, lng=lng_text, address=address_text, phone_number=phone_text, business_hour=business_hours_text, city=local, ) for index, url in enumerate(urls): img = models.Photo() img.bakery = models.Bakery.objects.get(name=name_text) img.photo = f"bakery/bread_imgs/{random_names[index]}.jpg" img.save() for index, menu in enumerate(menus_list): m = models.Menu() m.bakery = models.Bakery.objects.get(name=name_text) m.name = menu[0] try: m.row_price = menu[1] except: pass m.save() urls = [] random_names = [] driver.close() driver.switch_to_window(driver.window_handles[0]) except NoSuchElementException: a.send_keys(Keys.PAGE_DOWN) links = driver.find_elements_by_css_selector( "#info\.search\.place\.list > li") more = driver.find_element_by_css_selector("#info\.search\.place\.more") more.send_keys(Keys.ENTER) time.sleep(3) links = driver.find_elements_by_css_selector( "#info\.search\.place\.list > li") for link in links: try: a = link.find_element_by_css_selector( "div.info_item > div.contact.clickArea > a.moreview") a.send_keys(Keys.ENTER) time.sleep(1) driver.switch_to_window(driver.window_handles[1]) # 데이터생성 작업시작 # name 정보수집 name = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div:nth-child(1) > div.place_details > div > h2" ) name_text = name.text # address 정보수집 try: address = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(2) > div > span.txt_address" ) address_text = address.text except: address_text = "" # phone_number 정보수집 try: phone = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div.placeinfo_default.placeinfo_contact > div > div > span > span.txt_contact" ) phone_text = phone.text except: phone_text = "" try: # 영업일 더보기정보 클릭 date_btn = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.location_present > ul > li > a" ) date_btn.send_keys(Keys.ENTER) # business hour 정보수집 business_hours = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.fold_floor > div > ul:nth-child(2)" ) business_hours_text = business_hours.text # 뜬 창 닫기 close_btn = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.fold_floor > div > a" ) close_btn.send_keys(Keys.ENTER) except NoSuchElementException: try: business_hours = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div > ul > li > span" ) business_hours_text = business_hours.text except NoSuchElementException: business_hours_text = "" # 스크롤 내리기 body = driver.find_element_by_css_selector("body") body.send_keys(Keys.PAGE_DOWN) # sub_name 데이터 수집 try: sub_name = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div.placeinfo_default.open_on > div > p" ) sub_name_text = sub_name.text except NoSuchElementException: sub_name_text = "" # menus_list 데이터 수집 menus = driver.find_elements_by_css_selector("ul.list_menu > li") menus_list = [] for menu in menus: if menu.find_element_by_css_selector( "div span.loss_word").text == "": break add = [] add.append( menu.find_element_by_css_selector( "div span.loss_word").text) try: add.append( int( menu.find_element_by_css_selector( "div em.price_menu").text.replace(",", ""))) except: pass menus_list.append(add) # 사진 데이터 수집 try: photo_button = driver.find_element_by_css_selector( "#mArticle > div.cont_photo > div.photo_area > ul > li.size_l > a" ) action = ActionChains(driver) action.move_to_element(photo_button).perform() photo_button.send_keys(Keys.ENTER) urls = [] time.sleep(2) imgs = driver.find_elements_by_css_selector( "ul.list_phtoview > li") for index, img in enumerate(imgs): if index == 3: break link = img.find_element_by_css_selector("a") link.send_keys(Keys.ENTER) time.sleep(1) real_link = driver.find_element_by_css_selector( "#photoViewer > div.layer_body > div.view_photo > div.view_image > img" ) urls.append(real_link.get_attribute("src")) time.sleep(3) chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" random_names = [] for name in range(len(urls)): random_names.append("".join( (random.choice(chars)) for x in range(10))) for index, url in enumerate(urls): # urlretrieve는 다운로드 함수 urllib.request.urlretrieve( url, os.path.join( BASE_DIR, f"uploads/bakery/bread_imgs/{random_names[index]}.jpg", ), ) except: pass # lat,lng 정보수집 driver.get( f"https://www.google.co.kr/maps/@37.053745,125.6553969,5z?hl=ko" ) google_search_box = driver.find_element_by_css_selector( "#searchboxinput") google_search_box.send_keys(name_text) google_search_box.send_keys(Keys.ENTER) time.sleep(3) try: # 검색했는데 바로 상세로 안가고 목록으로 가면 가장 첫번째 목록 클릭 go_to = driver.find_element_by_css_selector( "#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-layout.section-scrollbox.scrollable-y.scrollable-show.section-layout-flex-vertical > div.section-layout.section-scrollbox.scrollable-y.scrollable-show.section-layout-flex-vertical > div:nth-child(1) > div.section-result-content > div.section-result-text-content" ) go_to.send_keys(Keys.ENTER) time.sleep(3) lat_text = float( driver.current_url.split("@")[1].split(",")[0]) lng_text = float( driver.current_url.split("@")[1].split(",")[1]) except: # 목록이 안뜰경우 try: # 상세로 간 경우 ex = driver.find_element_by_css_selector( "#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-hero-header-title > div.section-hero-header-title-top-container > div.section-hero-header-title-description > div:nth-child(1) > h1 > span:nth-child(1)" ) lat_text = float( driver.current_url.split("@")[1].split(",")[0]) lng_text = float( driver.current_url.split("@")[1].split(",")[1]) except: # 검색결과를 찾지 못한경우 lat_text = 0 lng_text = 0 # print( # name_text, # sub_name_text, # address_text, # business_hours_text, # lat_text, # lng_text, # phone_text, # menus_list, # ) try: bakery = models.Bakery.objects.get(name=name_text) except: models.Bakery.objects.create( name=name_text, sub_name=sub_name_text, lat=lat_text, lng=lng_text, address=address_text, phone_number=phone_text, business_hour=business_hours_text, city=local, ) for index, url in enumerate(urls): img = models.Photo() img.bakery = models.Bakery.objects.get(name=name_text) img.photo = f"bakery/bread_imgs/{random_names[index]}.jpg" img.save() for index, menu in enumerate(menus_list): m = models.Menu() m.bakery = models.Bakery.objects.get(name=name_text) m.name = menu[0] try: m.row_price = menu[1] except: pass m.save() urls = [] random_names = [] driver.close() driver.switch_to_window(driver.window_handles[0]) except NoSuchElementException: a.send_keys(Keys.PAGE_DOWN) links = driver.find_elements_by_css_selector( "#info\.search\.place\.list > li") # # 2바퀴돌고 끝내기 # return page_3 = driver.find_element_by_css_selector("#info\.search\.page\.no3") page_3.send_keys(Keys.ENTER) time.sleep(3) links = driver.find_elements_by_css_selector( "#info\.search\.place\.list > li") for link in links: try: a = link.find_element_by_css_selector( "div.info_item > div.contact.clickArea > a.moreview") a.send_keys(Keys.ENTER) time.sleep(1) driver.switch_to_window(driver.window_handles[1]) # 데이터생성 작업시작 # name 정보수집 name = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div:nth-child(1) > div.place_details > div > h2" ) name_text = name.text # address 정보수집 try: address = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(2) > div > span.txt_address" ) address_text = address.text except: address_text = "" # phone_number 정보수집 try: phone = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div.placeinfo_default.placeinfo_contact > div > div > span > span.txt_contact" ) phone_text = phone.text except: phone_text = "" try: # 영업일 더보기정보 클릭 date_btn = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.location_present > ul > li > a" ) date_btn.send_keys(Keys.ENTER) # business hour 정보수집 business_hours = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.fold_floor > div > ul:nth-child(2)" ) business_hours_text = business_hours.text # 뜬 창 닫기 close_btn = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div.fold_floor > div > a" ) close_btn.send_keys(Keys.ENTER) except NoSuchElementException: try: business_hours = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div:nth-child(3) > div > div > ul > li > span" ) business_hours_text = business_hours.text except NoSuchElementException: business_hours_text = "" # 스크롤 내리기 body = driver.find_element_by_css_selector("body") body.send_keys(Keys.PAGE_DOWN) # sub_name 데이터 수집 try: sub_name = driver.find_element_by_css_selector( "#mArticle > div.cont_essential > div.details_placeinfo > div.placeinfo_default.open_on > div > p" ) sub_name_text = sub_name.text except NoSuchElementException: sub_name_text = "" # menus_list 데이터 수집 menus = driver.find_elements_by_css_selector("ul.list_menu > li") menus_list = [] for menu in menus: if menu.find_element_by_css_selector( "div span.loss_word").text == "": break add = [] add.append( menu.find_element_by_css_selector( "div span.loss_word").text) try: add.append( int( menu.find_element_by_css_selector( "div em.price_menu").text.replace(",", ""))) except: pass menus_list.append(add) # 사진 데이터 수집 try: photo_button = driver.find_element_by_css_selector( "#mArticle > div.cont_photo > div.photo_area > ul > li.size_l > a" ) action = ActionChains(driver) action.move_to_element(photo_button).perform() photo_button.send_keys(Keys.ENTER) urls = [] time.sleep(2) imgs = driver.find_elements_by_css_selector( "ul.list_phtoview > li") for index, img in enumerate(imgs): if index == 3: break link = img.find_element_by_css_selector("a") link.send_keys(Keys.ENTER) time.sleep(1) real_link = driver.find_element_by_css_selector( "#photoViewer > div.layer_body > div.view_photo > div.view_image > img" ) urls.append(real_link.get_attribute("src")) time.sleep(3) chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" random_names = [] for name in range(len(urls)): random_names.append("".join( (random.choice(chars)) for x in range(10))) for index, url in enumerate(urls): # urlretrieve는 다운로드 함수 urllib.request.urlretrieve( url, os.path.join( BASE_DIR, f"uploads/bakery/bread_imgs/{random_names[index]}.jpg", ), ) except: pass # lat,lng 정보수집 driver.get( f"https://www.google.co.kr/maps/@37.053745,125.6553969,5z?hl=ko" ) google_search_box = driver.find_element_by_css_selector( "#searchboxinput") google_search_box.send_keys(name_text) google_search_box.send_keys(Keys.ENTER) time.sleep(3) try: # 검색했는데 바로 상세로 안가고 목록으로 가면 가장 첫번째 목록 클릭 go_to = driver.find_element_by_css_selector( "#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-layout.section-scrollbox.scrollable-y.scrollable-show.section-layout-flex-vertical > div.section-layout.section-scrollbox.scrollable-y.scrollable-show.section-layout-flex-vertical > div:nth-child(1) > div.section-result-content > div.section-result-text-content" ) go_to.send_keys(Keys.ENTER) time.sleep(3) lat_text = float( driver.current_url.split("@")[1].split(",")[0]) lng_text = float( driver.current_url.split("@")[1].split(",")[1]) except: # 목록이 안뜰경우 try: # 상세로 간 경우 ex = driver.find_element_by_css_selector( "#pane > div > div.widget-pane-content.scrollable-y > div > div > div.section-hero-header-title > div.section-hero-header-title-top-container > div.section-hero-header-title-description > div:nth-child(1) > h1 > span:nth-child(1)" ) lat_text = float( driver.current_url.split("@")[1].split(",")[0]) lng_text = float( driver.current_url.split("@")[1].split(",")[1]) except: # 검색결과를 찾지 못한경우 lat_text = 0 lng_text = 0 # print( # name_text, # sub_name_text, # address_text, # business_hours_text, # lat_text, # lng_text, # phone_text, # menus_list, # ) try: bakery = models.Bakery.objects.get(name=name_text) except: models.Bakery.objects.create( name=name_text, sub_name=sub_name_text, lat=lat_text, lng=lng_text, address=address_text, phone_number=phone_text, business_hour=business_hours_text, city=local, ) for index, url in enumerate(urls): img = models.Photo() img.bakery = models.Bakery.objects.get(name=name_text) img.photo = f"bakery/bread_imgs/{random_names[index]}.jpg" img.save() for index, menu in enumerate(menus_list): m = models.Menu() m.bakery = models.Bakery.objects.get(name=name_text) m.name = menu[0] try: m.row_price = menu[1] except: pass m.save() urls = [] random_names = [] driver.close() driver.switch_to_window(driver.window_handles[0]) except NoSuchElementException: a.send_keys(Keys.PAGE_DOWN) links = driver.find_elements_by_css_selector( "#info\.search\.place\.list > li")
def mousehover(self,locator,moveto): weblocator = self.locator.split('=') if weblocator[0] == "XPath": self.retlocator = self.driver.find_elements_by_xpath(weblocator[1]) hover = ActionChains(self.driver) hover.move_to_element(self.retlocator).perform()