python库的解析--selenium-python自动化(selenium库)

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import base64
import time
'''
    from selenium.webdriver.common.by import By
    By.method method 种类
        CLASS_NAME
        CSS_SELECTOR 
        ID 
        LINK_TEXT 
        NAME 
        PARTIAL_LINK_TEXT 
        TAG_NAME 
        XPATH 
'''
r'''
    from selenium.webdriver.common.keys import Keys
    Keys中的特殊按键代表的Unicode编码
        ADD = '\ue025'
        ALT = '\ue00a'
        ARROW_DOWN = '\ue015'
        ARROW_LEFT = '\ue012'
        ARROW_RIGHT = '\ue014'
        ARROW_UP = '\ue013'
        BACKSPACE = '\ue003'¶
        BACK_SPACE = '\ue003'
        CANCEL = '\ue001'
        CLEAR = '\ue005'
        COMMAND = '\ue03d'
        CONTROL = '\ue009'
        DECIMAL = '\ue028'
        DELETE = '\ue017'
        DIVIDE = '\ue029'
        DOWN = '\ue015'
        END = '\ue010'
        ENTER = '\ue007'
        EQUALS = '\ue019'
        ESCAPE = '\ue00c'
        F1 = '\ue031'
        F10 = '\ue03a'
        F11 = '\ue03b'
        F12 = '\ue03c'
        F2 = '\ue032'
        F3 = '\ue033'
        F4 = '\ue034'
        F5 = '\ue035'
        F6 = '\ue036'
        F7 = '\ue037'
        F8 = '\ue038'
        F9 = '\ue039'
        HELP = '\ue002'
        HOME = '\ue011'
        INSERT = '\ue016'
        LEFT = '\ue012'
        LEFT_ALT = '\ue00a'
        LEFT_CONTROL = '\ue009'
        LEFT_SHIFT = '\ue008'
        META = '\ue03d'
        MULTIPLY = '\ue024'
        NULL = '\ue000'
        NUMPAD0 = '\ue01a'
        NUMPAD1 = '\ue01b'
        NUMPAD2 = '\ue01c'
        NUMPAD3 = '\ue01d'
        NUMPAD4 = '\ue01e'
        NUMPAD5 = '\ue01f'
        NUMPAD6 = '\ue020'
        NUMPAD7 = '\ue021'
        NUMPAD8 = '\ue022'
        NUMPAD9 = '\ue023'
        PAGE_DOWN = '\ue00f'
        PAGE_UP = '\ue00e'
        PAUSE = '\ue00b'
        RETURN = '\ue006'
        RIGHT = '\ue014'
        SEMICOLON = '\ue018'
        SEPARATOR = '\ue026'
        SHIFT = '\ue008'
        SPACE = '\ue00d'
        SUBTRACT = '\ue027'
        TAB = '\ue004'
        UP = '\ue013'
'''


# 自定义显示等待条件
class ElementHasCssClass(object):
    def __init__(self, locator, css_class):
        self.locator = locator
        self.css_class = css_class

    def __call__(self, driver):
        element = driver.find_element(*self.locator)
        if self.css_class in element.get_attribute('id'):
            return element
        else:
            return None


# selenium入门知识
def base_selenium_performance():
    url = 'https://www.baidu.com'

    # webdriver.Chrome()初始化浏览器
    driver = webdriver.Chrome()
    '''
        其他浏览器初始化:
            webdriver.Firefox
            webdriver.FirefoxProfile
            webdriver.Chrome
            webdriver.ChromeOptions
            webdriver.Ie
            webdriver.Opera
            webdriver.PhantomJS
            webdriver.Remote
            webdriver.DesiredCapabilities
            webdriver.ActionChains
            webdriver.TouchActions
            webdriver.Proxy
    '''

    # driver.minimize_window()屏幕最小化
    driver.minimize_window()
    time.sleep(1)

    # driver.maximize_window()屏幕最大化
    driver.maximize_window()
    time.sleep(1)
    '''
        自定义屏幕大小
         driver.set_window_size(width, height, windowsHandler)
    '''

    try:
        # driver.implicitly_wait(time)隐式等待
        driver.implicitly_wait(10)

        # driver.get(url=None)将定位给定的URL网页
        driver.get(url)

        # driver.switch_to.alert 窗口弹窗处理
        try:
            alert = driver.switch_to.alert
            alert.send_keys("Mike")
            alert.accept()
            '''
                alert.accept()  接受/确认弹窗
                alert.dismiss() 拒绝/取消弹窗
                alert..send_keys()  向弹窗中传递数据
                alert.text  获取弹窗中的文本
            '''
        except:
            print('there is no alert')

        set_btn = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
        actions = ActionChains(driver)
        actions.move_to_element(set_btn).perform()

        # WebDriverWait(driver, time).until(EC.condition((method, value)))
        WebDriverWait(driver, 10).until(ElementHasCssClass((By.ID, 'kw'), 'kw'))
        '''
            其他condition条件
                title_is 标题是某内容
                title_contains  标题包含某内容
                present_of_element_located  节点加载出来,传入定位元组,例如:(By.ID, 'kw')
                visible_of_element_located  节点课件,传入定位元组
                visible_of  可见,传入节点对象
                present_of_all_elements_located 所有节点加载出来
                text_to_be_present_in_element   某节点中包含某些内容
                text_to_be_present_in_element_value 某节点值种包含某些内容
                frame_to_be_available_and_switch_to_it  加载并切换
                invisibility_of_element_located 节点不可见
                element_to_be_clickable 节点可点击
                staleness_of    判断一个节点是否仍为DOM,可判断页面是否刷新
                element_to_be_selected  节点可选择,传入节点对象
                element_located_to_be_selected  节点可选择,传入定位元组
                element_selection_state_to_be   传入节点对象以及状态,相等返回True,否则返回False
                element_located_selection_state_to_be   传入定位元组以及状态,相等返回True,否则返回False
                alert_is_present    是否出现警告  
        '''

        # selenium.webdriver.chrome.webdriver.WebDriver.current_url 打印当前网页URL
        print(driver.current_url)

        # selenium.webdriver.chrome.webdriver.WebDriver.get_cookies() 打印网页cookie
        print(driver.get_cookies())

        # selenium.webdriver.chrome.webdriver.WebDriver.page_source 打印网页源代码
        print(driver.page_source)

        # selenium.webdriver.chrome.webdriver.WebDriver.page_source 打印网页源title
        print(driver.title)

        news_titles = driver.find_elements_by_xpath("//li[@class='hotsearch-item odd']"
                                                    "/a/span[@class='title-content-title']")
        for news_title in news_titles:
            # element.get_attribute 获取标签属性
            print(news_title.get_attribute('class'))

            # element.text 获取标签内容
            print(news_title.text)
            '''
                也可指直接获取其标签中属性
                    element.id
                    element.location
                    element.tag_name
                    element.size
            '''

        #  driver.find_element_by_id根据id获取属性元素
        driver.find_element_by_id('kw').send_keys('python')
        time.sleep(1)
        driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
        time.sleep(1)
        driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')
        time.sleep(1)
        driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
        time.sleep(1)
        '''
            其他获取一个元素的方法:
                find_element_by_id 根据id
                find_element_by_name 根据name
                find_element_by_xpath 根据xpath
                find_element_by_link_text 根据文本
                find_element_by_partial_link_text 根据固定文本
                find_element_by_tag_name 根据标签名
                find_element_by_class_name 根据标签的class属性
                find_element_by_css_selector 根据css选择器
                
                上述函数等价于:
                    find_element(By.method, value)
                    例如:driver.find_element_by_id('kw')
                        <=>driver.find_element(By.ID, 'kw')
                        
            获取多个元素的方法:
                find_elements_by_id 根据id
                find_elements_by_name 根据name
                find_elements_by_xpath 根据xpath
                find_elements_by_link_text 根据文本
                find_elements_by_partial_link_text 根据固定文本
                find_elements_by_tag_name 根据标签名
                find_elements_by_class_name 根据标签的class属性
                find_elements_by_css_selector 根据css选择器
                
                上述函数等价于:
                    find_elements(By.method, value)
                    例如:driver.find_elements_by_id('kw')
                        <=>driver.find_elements(By.ID, 'kw')
        '''
        '''
            IO交互
                element.send_keys(text) 向element传递text文本
                element.clear() 清空element中的内容
                element.click() 点击element
        '''
        search_btn = driver.find_element_by_id('su')
        search_btn.click()

        driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
        time.sleep(2)
        driver.execute_script('alert("To Bottom")')
        time.sleep(2)

        alert = driver.switch_to.alert
        alert.accept()

        # element.is_display() 是否存在某个元素
        print(search_btn.is_displayed())
        # print(search_btn.is_selected())
        # print(search_btn.is_enabled())
        time.sleep(2)
        '''
            element.is_enabled() 元素是否可操作
            element.is_selected() 元素是否被选中(通常出现在单选按钮、复选框)
        '''

        time.sleep(5)
        driver.get("https://www.taobao.com")
        time.sleep(2)

        # driver.back()返回前一个页面
        driver.back()
        time.sleep(2)

        # driver.forward()返回到后一个页面
        driver.forward()
        time.sleep(2)

        driver.back()
        time.sleep(2)

        driver.get("http://www.example.com")
        time.sleep(2)

        # driver.get_cookies() 获取页面返回的cookie属性
        print(driver.get_cookies())

        # driver.add_cookie() 向页面返回的Cookies属性中添加内容
        driver.add_cookie({'name': 'Bob', 'age': 20, 'value': 'you'})

        print(driver.get_cookies())

        # driver.delete_all_cookies() 删除所有页面返回的cookies信息
        driver.delete_all_cookies()

        print(driver.get_cookies())

        driver.back()
        time.sleep(2)

        # driver.window_handles当前网页选项卡
        print(driver.window_handles)

        # driver.execute_script()执行js脚本
        driver.execute_script('window.open()')
        '''
            也可以使用以下方法打开一个新窗口
                driver.get('https://www.baidu.com')
                time.sleep(2)
                header = driver.find_element_by_id('head_wrapper')
                header.click()
                header.send_keys(Keys.CONTROL, 't')
        '''

        print(driver.window_handles)

        # driver.switch_to.window()切换网页选项卡
        driver.switch_to.window(driver.window_handles[1])

        driver.get('https://www.taobao.com')
        time.sleep(2)
        print(driver.window_handles)
        driver.close()
        print(driver.window_handles)
        driver.switch_to.window(driver.window_handles[0])

        assert "百度搜索" in driver.page_source

        # driver.get_screenshot_as_file()获取屏幕闪照
        driver.get_screenshot_as_file("E:/projectOfPython/projectOfSpiderHomeworkD/baidu.png")
        '''
            网页截图
                driver.get_screenshot_as_file(filename)
                driver.get_screenshot_as_png()
                    with open(filepath, 'wb) as f:
                        f.write(driver.get_screenshot_as_png())
                    对base64模式处理文件页面进行了方法封装
                driver.get_screenshot_as_base64()
                    with open(filepath, 'wb) as f:
                        f.write(base64.b64decode(driver.get_screenshot_as_base64().encode('ascii)))
        '''
    except TimeoutException:
        print('Time Out')
    except NoSuchElementException:
        print('No Such Element')
    finally:
        time.sleep(2)

        # driver.close()关闭页面
        driver.close()
        '''
            dirver.quit()关闭页面
        '''

    '''
    所有Webdriver代码中可能发生的异常:
        selenium.common.exceptions 异常
            ElementClickInterceptedException (msg = None,screen = None,stacktrace = None 
                无法完成“元素点击”命令,因为接收事件的元素遮盖了请求单击的元素。

            ElementNotInteractableException (msg = None,screen = None,stacktrace = None )
                当元素存在于DOM中但与该元素的交互会命中另一个元素时抛出,以绘制顺序

            ElementNotSelectableException (msg = None,screen = None,stacktrace = None )
                尝试选择不可选择的元素时抛出
                    例如,选择一个“脚本”元素

            ElementNotVisibleException (msg = None,screen = None,stacktrace = None )
                当元素出现在DOM上但不可见时抛出,因此无法与之交互。
                    尝试单击或阅读从视图中隐藏的元素的文本时最常遇到的问题

            ErrorInResponseException (response,msg )[资源]
                在服务器端发生错误时抛出
                    与firefox扩展或远程驱动程序服务器通信时,可能会发生这种情况

            ImeActivationFailedException (msg = None,screen = None,stacktrace = None )
                激活IME引擎时抛出失败

            ImeNotAvailableException (msg = None,screen = None,stacktrace = None )
                当IME支持不可用时抛出
                    如果计算机上没有IME支持,则会为每个与IME相关的方法调用引发此异常

            InsecureCertificateException (msg = None,screen = None,stacktrace = None )
                导航导致用户代理命中证书警告,这通常是TLS证书过期或无效的结果

            InvalidArgumentException (msg = None,screen = None,stacktrace = None )
                传递给命令的参数无效或格式错误

            InvalidCookieDomainException (msg = None,screen = None,stacktrace = None )
                尝试在与当前URL不同的域下添加cookie时抛出

            InvalidCoordinatesException (msg = None,screen = None,stacktrace = None )
                提供给交互操作的坐标无效

            InvalidElementStateException (msg = None,screen = None,stacktrace = None )
                由于元素处于无效状态而无法完成命令时抛出
                    这可能是由于尝试清除既不可编辑又不可重置的元素引起的

            InvalidSelectorException (msg = None,screen = None,stacktrace = None )
                当用于查找元素的选择器未返回WebElement时抛出
                    当前,仅当选择器是xpath表达式并且在语法上无效
                        (即它不是xpath表达式)或表达式未选择WebElement时(例如“ count(// input)”)
                    ,才会发生这种情况。

            InvalidSessionIdException (msg = None,screen = None,stacktrace = None )
                如果给定的会话ID不在活动会话列表中,则发生,这意味着该会话不存在或未处于活动状态

            InvalidSwitchToTargetException (msg = None,screen = None,stacktrace = None )
                当不存在要切换的帧或窗口目标时抛出

            JavascriptException (msg = None,screen = None,stacktrace = None )
                执行用户提供的JavaScript时发生错误

            MoveTargetOutOfBoundsException (msg = None,screen = None,stacktrace = None )
                当提供给ActionsChains move()方法的目标无效(即不在文档中)时抛出

            NoAlertPresentException (msg = None,screen = None,stacktrace = None )
                切换为无提示时抛出   
                    这可能是由于在屏幕上还没有警报时调用Alert()类上的操作引起的

            NoSuchAttributeException (msg = None,screen = None,stacktrace = None )
                在找不到元素的属性时抛出
                    您可能要检查该属性是否存在于要测试的特定浏览器中
                        某些浏览器对于同一属性可能具有不同的属性名称(IE8的.innerText与Firefox .textContent)

            NoSuchCookieException (msg = None,screen = None,stacktrace = None )
                在当前浏览上下文的活动文档的关联cookie中未找到与给定路径名匹配的cookie

            NoSuchElementException (msg = None,screen = None,stacktrace = None )
                找不到元素时抛出
                    如果遇到此异常,则可能需要检查以下内容:
                        检查您的find_by中使用的选择器...
                        查找操作时,元素可能尚未显示在屏幕上(网页仍在加载中)有关如何编写等待包装器以等待元素出现的信息\
                            请参见selenium.webdriver.support.wait.WebDriverWait()
                            
            NoSuchFrameException (msg = None,screen = None,stacktrace = None )
                当不存在要切换的帧目标时抛出

            NoSuchWindowException (msg = None,screen = None,stacktrace = None )
                当不存在要切换的窗口目标时抛出     
                    要查找当前的活动窗口句柄集,可以通过以下方式获得活动窗口句柄的列表:
                        打印driver.window_handles
            RemoteDriverServerException (msg = None,screen = None,stacktrace = None )
            ScreenshotException (msg = None,screen = None,stacktrace = None )
                屏幕截图变得不可能

            SessionNotCreatedException (msg = None,screen = None,stacktrace = None )
                无法创建新的会话

            StaleElementReferenceException (msg = None,screen = None,stacktrace = None )
                当对元素的引用现在“陈旧”时抛出
                    陈旧意味着元素不再出现在页面的DOM上。
                        StaleElementReferenceException的可能原因包括但不限于:
                            您不再位于同一页面上,或者自找到元素以来该页面可能已刷新。
                            自找到元素以来,该元素可能已被删除并重新添加到屏幕上
                                例如正在重定位的元素
                                    当值更新并重建节点时,这通常会在JavaScript框架中发生。
                            元素可能位于iframe或其他刷新的上下文中。
            TimeoutException (msg = None,screen = None,stacktrace = None )
                当命令没有在足够的时间内完成时抛出

            UnableToSetCookieException (msg = None,screen = None,stacktrace = None )
                当驱动程序无法设置cookie时抛出

            UnexpectedAlertPresentException (msg = None,screen = None,stacktr           
                出现意外警报时抛出
                    通常在预期的模式阻止WebDriver形式执行更多命令时引发

            UnexpectedTagNameException (msg = None,screen = None,stacktrace = None )
                当支持类未获得预期的Web元素时抛出

            UnknownMethodException (msg = None,screen = None,stacktrace = None )
                请求的命令与已知URL匹配,但与该URL的方法不匹配

            WebDriverException (msg = None,screen = None,stacktrace = None )
                基本的webdriver异常
    '''


def selenium_action_chain():
    url = 'https://www.baidu.com'
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get(url)
    bar = driver.find_element_by_id('kw')
    btn = driver.find_element_by_id('su')
    # bar.send_keys('python')

    actions = ActionChains(driver)

    # key_down (value,element = None )[资源]
    # 仅发送按键,但不释放按键。
    # 仅应与修饰键(Control,Alt和Shift)一起使用。
    # 值:要发送的修饰键。值在Keys类中定义。
    # element:发送密钥的元素。如果为None,则将密钥发送到当前关注的元素。
    # 例如,按ctrl + c:

    # key_up (value,element = None )[资源]
    # 释放修饰键
    # value:要发送的修饰键。值在Keys类中定义。
    # element:发送密钥的元素。如果为None,则将密钥发送到当前关注的元素。
    # 例如,按ctrl + c

    # move_by_offset (xoffset,yoffset )[资源]
    # 将鼠标移动到当前鼠标位置的偏移处。
    # xoffset:要移动的X偏移量,为正整数或负整数。
    # yoffset:要移动的Y偏移,为正或负整数。

    # # move_to_element (to_element )
    # # 将鼠标移到元素的中间
    # actions.move_to_element(btn).perform()

    # move_to_element_with_offset (to_element,xoffset,yoffset )[资源]
    # 将鼠标移动指定元素的偏移量。
    # 偏移量相对于元素的左上角。
    # to_element:要移动到的WebElement。
    # xoffset:要移动的X偏移量。
    # yoffset:要移动的Y偏移量。

    # # pause(second)
    # # 暂停所有输入达指定的持续时间(以秒为单位)
    # actions.pause()
    #
    # # perform()
    # # 执行所有存储的动作
    # actions.perform()
    #
    # # 释放(on_element = None )[资源]
    # # 释放元素上按住的鼠标键
    # actions.release(btn)

    # # reset_actions ()[资源]
    # # 清除已经在本地和远程存储的操作
    # action.reset_actions()

    # # send_keys_to_element (元素,* keys_to_send )[资源]
    # # 将键发送到元素
    # actions.send_keys_to_element(bar, 'python').perform()
    #
    # # send_keys (* keys_to_send )[资源]
    # # 将键发送到当前的焦点元素
    # actions.send_keys(bar, 'python').perform()

    # btn = driver.find_element_by_id('su')

    # # click_and_hold (on_element = None )
    # # 在元素上按住鼠标左键。
    # actions.click_and_hold(btn)
    # actions.perform()

    # # 点击(on_element = None )
    # # 单击一个元素。
    # actions.click(btn).perform()
    # # btn.click()

    # # context_click (on_element = None )[资源]
    # # 在元素上执行上下文单击(右键单击)
    # actions.context_click(btn)

    # # double_click (on_element = None )[资源]
    # # 双击一个元素
    # actions.double_click(btn)

    # url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    # driver.get(url)
    # driver.switch_to.frame('iframeResult')
    # source = driver.find_element_by_css_selector('#draggable')
    # target = driver.find_element_by_css_selector('#droppable')
    # actions = ActionChains(driver)
    # # rag_and_drop (源,目标)[资源]
    # # 按住源元素上的鼠标左键,
    # # 然后移动到目标元素并释放鼠标按钮
    # actions.drag_and_drop(source, target)
    # actions.perform()

    time.sleep(3)
    driver.close()


base_selenium_performance()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值