美文网首页
python+selenium

python+selenium

作者: 开心的小哈 | 来源:发表于2022-07-04 20:10 被阅读0次

    概念:

    基于浏览器自动化的一个模块

    快速入门

    • 安装pip install selenium
    • 下载一个浏览器的驱动程序
    • 实例化一个浏览器对象
    • 编写基于浏览器自动化的操作代码
    from selenium import webdriver
    import lxml.etree as e
    from time import sleep
    from selenium.webdriver import ChromeOptions
    # bor=webdriver.Edge(executable_path='./msedgedriver.exe')
    # bor.get('http://scxk.nmpa.gov.cn:81/xk/')
    # bor.get('https://www.ic.net.cn/')
    #实现让selenium规避被检测到的风险
    option=ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    #加载谷歌驱动程序
    bro=webdriver.Edge('./msedgedriver.exe')
    #对当前页面发起请求
    bro.get('http://scxk.nmpa.gov.cn:81/xk/')
    
    
    page_text=bro.page_source
    # 解析企业名称
    tree=e.HTML(page_text)
    li_list=tree.xpath('//ul[@id="gzlist"]/li')
    for li in li_list:
        name=li.xpath('./d;/@title')[0]
        print(name)
    sleep(3)
    bro.quit()
    
    1. page_source获取页面源码数据(加载完成后的)
    2. 标签定位:find系列的方法
    3. 标签交互:send_keys('xxx')
    4. 发起请求:get(url)
    5. 执行js程序:excute_script('jsCode')
    6. 前进,后退:back(),forward()
    7. 关闭浏览器:quit()
    8. 关闭当前页面:close()
    • selenium处理iframe
    1. 如果定位的标签存在于iframe标签之中,则必须使用switch_to_frame('iframeResult')切换浏览器标签定位的作用域
    2. 动作链(拖动):from selenium.webdriver import ActionChains
      1. 实例化一个动作连对象:action=ActionChains(bro)
      2. 长安且点击标签 aciton.click_and_hold(div)
      3. action. Message: session not created: No matching capabilities foundmove_by_offset(x,y).perform()让动作连立即执行
      4. action.release()释放动作连对象

    设置无头,不展示浏览器的EDGE浏览器

    from selenium import webdriver
    from time import sleep
    
    # 实现无可视化界面
    from selenium.webdriver.edge.options import Options
    
    # 实现规避检测
    from msedge.selenium_tools import EdgeOptions
    from msedge.selenium_tools import Edge
    
    # 实现无可视化界面的操作
    EDGE = {
        "browserName": "MicrosoftEdge",
        "version": "103.0.1264.44",
        "platform": "WINDOWS",
        # 关键是下面这个
        "ms:edgeOptions": {
            'extensions': [],
            'args': [
                '--headless',
                '--disable-gpu',
                '--remote-debugging-port=9222',
            ]}
    }
    
    # 实现规避检测
    option = EdgeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    
    # 如何实现让selenium规避被检测到的风险
    bro = webdriver.Edge(executable_path='./msedgedriver.exe', capabilities=EDGE)
    
    # 无可视化界面(无头浏览器)
    bro.get("https://www.baidu.com")
    
    print(bro.page_source)
    sleep(2)
    bro.quit()
    
    
    

    seleium中./和.//定位,列表获取范围

    List<WebElement> selectAddress = ToolDriver.getList("//*[@id=\"main_view\"]/div[4]/div/div/div/","选择部门");//div下方很有多个同一级div
            WebElement webElement = selectAddress.get(selectAddress.size()-1);//同一级的最后一个div获取到
            List<WebElement> findElements = webElement.findElements(By.xpath("./div"));//最后一级里面还有多个div此时就要区分使用./标识表示当前列表寻找div.//标识当前列表和当前及下方的列表寻找div
    

    这里要注意.//表示在当前元素下接着寻找,如果没有前面的.使用//则是寻找该页码全部的匹配的元素

    By.xpath("./div")定位div

    使用./标识表示当前列表寻找div.//标识当前列表和当前及下方的列表寻找div

    喜喜

    两种获取list Elements方式

    第一种:获取父级再获取多个子集

      WebElement findElement = chromeDriver.findElement(By.xpath("/html/body/div[2]/div/div[4]/div[1]/div[2]/div[4]/div[2]/ul"));
                List<WebElement> findElements = findElement.findElements(By.xpath("li"));
    

    第二种:直接获取多个子集

    //直接将li写入xpath里用findElements获取多个li元素
    chromeDriver.findElements(By.xpath("/html/body/div[2]/div/div[4]/div[1]/div[2]/div[4]/div[2]/ul/li"));
    
    image.png

    确定元素位置

    mylabel = browser.find_element_by_xpath("html/body/div[15]/div[1]/label")

    actions = ActionChains(browser)

    移动到元素

    actions.move_to_element_with_offset(mylabel,-10,0).click().perform()

    ActionChains方法列表

    click(on_element=None) ——单击鼠标左键

    click_and_hold(on_element=None) ——点击鼠标左键,不松开

    context_click(on_element=None) ——点击鼠标右键

    double_click(on_element=None) ——双击鼠标左键

    drag_and_drop(source, target) ——拖拽到某个元素然后松开

    drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

    key_down(value, element=None) ——按下某个键盘上的键

    key_up(value, element=None) ——松开某个键

    move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

    move_to_element(to_element) ——鼠标移动到某个元素

    move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

    perform() ——执行链中的所有动作

    release(on_element=None) ——在某个元素位置松开鼠标左键

    send_keys(*keys_to_send) ——发送某个键到当前焦点的元素

    send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

    相关文章

      网友评论

          本文标题:python+selenium

          本文链接:https://www.haomeiwen.com/subject/keolbrtx.html