# -*- coding:utf8 -*- # 工程路径:selenium驱动浏览器详解.py # 工程日期:10/6/2019 # 工程目标:selenium 自动化测试库 #%% 用来驱动浏览器模拟人的操作 # 主要用于解析JS渲染的页面 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() # 声明一个浏览器对象 try: browser.get('https://www.baidu.com') # 发起请求 input = browser.find_element_by_id('kw') input.send_keys('美女图片') # 输入关键字 input.send_keys(Keys.ENTER) # 回车 wait = WebDriverWait(browser,10) # 等待 wait.until(EC.presence_of_element_located((By.ID, 'content_left'))) # 等待条件 print(browser.current_url) #输出 URL print(browser.get_cookies()) # 查看cookie finally: print("ok") browser.close() #%% 选择元素 # 普通选择 # css选择 # xpath选择 # 选取单个元素 from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.taobao.com') find_nom = browser.find_elements_by_id('q') # 正常方式查找 find_css = browser.find_element_by_css_selector('#q') # css选择器查找 find_xpath = browser.find_element_by_xpath('//*[@id="q"]') # xpath解析查找 print(find_css, find_nom, find_xpath) """ * find_element_by_name * find_element_by_xpath * find_element_by_link_text * find_element_by_partial_link_text * find_element_by_tag_name * find_element_by_class_name * find_element_by_css_selector """ # 通用查找 browser.find_element(By.ID, 'w') find_us = browser.find_element(By.ID, 'q') print(find_us) # 多个元素查找 print("----查找多个元素----") find_more = browser.find_elements_by_id('q') find_more_css = browser.find_elements_by_css_selector('.service-bd li') # 注意普通参数和CSS参数, 以及选择的那个元素和多个元素的复数的区别 find_more_nom = browser.find_elements(By.CSS_SELECTOR, '.service-bd li') print(find_more) print(find_more_css) print("# 注意普通参数和CSS参数, 以及选择的那个元素和多个元素的复数的区别") print(find_more_nom) """ 多个元素的的返回是列表的形式 * find_elements_by_name * find_elements_by_xpath * find_elements_by_link_text * find_elements_by_partial_link_text * find_elements_by_tag_name * find_elements_by_class_name * find_elements_by_css_selector """ #%% 元素的交互操作 # 对浏览器中的 # 获取浏览器的文本框,按钮,滑动条,交互 输入文字,对浏览器的元素进行操作模拟人交互 from selenium import webdriver import time browser = webdriver.Chrome() # 申明对象 browser.get('https://www.taobao.com') # 发起请求 input = browser.find_element_by_id('q') # 查找目标元素 input.send_keys('iPhone') # 输入关键字 time.sleep(1) # 模拟等待 input.clear() # 删除输入的关键字 input.send_keys('iPad') # 再次输入关键字 button = browser.find_element_by_class_name('btn-search') # 查找search点击按钮 button.click() # 模拟按钮的点击 #%% 更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement #%% 交互的动作 将元素的动作加到动作链中串行执行, action chains 动作链 from selenium import webdriver from selenium.webdriver import ActionChains browser = webdriver.Chrome() url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') # 切换到 iframe标签 source = browser.find_element_by_css_selector('#draggable') # 找到被拖动元素 target = browser.find_element_by_css_selector('#droppable') # 找到拖动的位置的目标元素 actions = ActionChains(browser) # 申明动作链对象 actions.drag_and_drop(source, target) # 执行拖拽 actions.perform() # 显示 #其他交互操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains """ click_and_hold(on_element=None) Holds down the left mouse button on an element. Args: on_element: The element to mouse down. If None, clicks on current mouse position. context_click(on_element=None) Performs a context-click (right click) on an element. Args: on_element: The element to context-click. If None, clicks on current mouse position. double_click(on_element=None) Double-clicks an element. Args: on_element: The element to double-click. If None, clicks on current mouse position. drag_and_drop(source, target) Holds down the left mouse button on the source element, then moves to the target element and releases the mouse button. Args: source: The element to mouse down. target: The element to mouse up. drag_and_drop_by_offset(source, xoffset, yoffset) Holds down the left mouse button on the source element, then moves to the target offset and releases the mouse button. Args: source: The element to mouse down. xoffset: X offset to move to. yoffset: Y offset to move to. key_down(value, element=None) Sends a key press only, without releasing it. Should only be used with modifier keys (Control, Alt and Shift). Args: value: The modifier key to send. Values are defined in Keys class. element: The element to send keys. If None, sends a key to current focused element. Example, pressing ctrl+c: ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() key_up(value, element=None) Releases a modifier key. Args: value: The modifier key to send. Values are defined in Keys class. element: The element to send keys. If None, sends a key to current focused element. Example, pressing ctrl+c: ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() move_by_offset(xoffset, yoffset) Moving the mouse to an offset from current mouse position. Args: xoffset: X offset to move to, as a positive or negative integer. yoffset: Y offset to move to, as a positive or negative integer. move_to_element(to_element) Moving the mouse to the middle of an element. Args: to_element: The WebElement to move to. move_to_element_with_offset(to_element, xoffset, yoffset) Move the mouse by an offset of the specified element. Offsets are relative to the top-left corner of the element. Args: to_element: The WebElement to move to. xoffset: X offset to move to. yoffset: Y offset to move to. pause(seconds) Pause all inputs for the specified duration in seconds perform() Performs all stored actions. release(on_element=None) Releasing a held mouse button on an element. Args: on_element: The element to mouse up. If None, releases on current mouse position. reset_actions() Clears actions that are already stored locally and on the remote end send_keys(*keys_to_send) Sends keys to current focused element. Args: keys_to_send: The keys to send. Modifier keys constants can be found in the ‘Keys’ class. send_keys_to_element(element, *keys_to_send) Sends keys to an element. Args: element: The element to send keys. keys_to_send: The keys to send. Modifier keys constants can be found in the ‘Keys’ class """ #%% 执行javascript # 通过execute_script 来执行javascript交互 # 万能方法 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("To Bottom")') #%% 获取页面的节点的属性信息, 文本信息 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') input = browser.find_element_by_class_name('zu-top-add-question') input1 = browser.find_element_by_class_name('zu-top-nav-link') print(input.text) print(input1.text) #%% 翻页操作 import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com/') browser.get('https://www.taobao.com/') browser.get('https://www.python.org/') browser.back() time.sleep(1) browser.forward() browser.close() #%% cookies 使用和管理 from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies()) #%% 异常的处理 # 查看官方文档详细的异常的情况 from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElementException browser = webdriver.Chrome() try: browser.get('https://www.baidu.com') except TimeoutException: print('Time Out') try: browser.find_element_by_id('hello') except NoSuchElementException: print('No Element') finally: browser.close() # 官方文档:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions