• Python Selenium 库使用技巧


    Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

    首先下载驱动文件:https://chromedriver.storage.googleapis.com/index.html?path=2.39/

    放入google目录下

    测试代码,测试是否能读取到驱动文件。

    from selenium import webdriver
    
    path = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=path)
    
    url = "https://www.baidu.com"
    driver.get(url)
    print(driver.page_source)
    

    简单的实现浏览器测试

    # -*- coding:utf-8 -*-
    from selenium import webdriver
    
    WebPath = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=WebPath)
    driver.set_window_size(1000,500)
    
    url = "https://www.baidu.com"
    driver.get(url)
    print(driver.find_element_by_id("kw"))
    

    Selenium 自动化测试库的使用:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="gbk">
        <title>Selenium Test</title>
    </head>
    <body>
        <div class="acount" id="aid">
            <a class="mnav" href="https://news.baidu.com" name="trnews">新闻</a>
            <a class="mnav" href="https://lyshark.cnblogs.com" name="myblog">我的博客</a>
            <a class="mnav" href="https://github.com/lyshark" name="mygit">GitHub</a>
        </div>
        <form id="forms" class="fms" name="submit_form" action="index.html">
            <span class="soutu-btn"></span>
            <p>用户: <input id="user" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off"></p>
            <p>密码: <input id="pass" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off"></p>
            <input type="submit" value="提交" />
        </form>
        <p name="p1" > hello lyshark p1</p>
        <p name="p2" > hello lyshark p2</p>
    </body>
    </html>
    

    通过简单的浏览文件并实现简单的定位.

    # 驱动下载地址: http://chromedriver.storage.googleapis.com/index.html
    from selenium import webdriver
    
    WebPath = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=WebPath)
    driver.set_window_size(1024,768)
    
    # 常用的定位变量参数如下所示.
    driver.get("http://lyshark.com")
    print("当前URL: {}".format(driver.current_url))
    print("当前标题: {}".format(driver.title))
    print("网页代码: {}".format(driver.page_source))
    
    # 基本的 find_element 标签查找定位方式
    print(driver.find_element_by_id("user"))          # 通过ID来查找元素
    print(driver.find_element_by_name("p1").text)     # 通过name属性来定位
    print(driver.find_element_by_class_name("s_ipt")) # 通过类名来定位
    
    # 通过xpath定位,xpath定位有N种写法,这里列几个常用写法
    print(driver.find_element_by_xpath("//form[@class='fms']//input[@id='user']"))
    print(driver.find_element_by_xpath("//p[@name='p1']"))
    print(driver.find_element_by_xpath("//html/body/form/p/input"))
    print(driver.find_elements_by_css_selector(".fms #user"))
    
    # 定位a标签中的关键字.
    print(driver.find_element_by_link_text("新闻"))
    print(driver.find_element_by_partial_link_text("我"))
    

    通过xpath定位标签并自动输入内容,发送登录请求到后端,写法如下.

    from selenium import webdriver
    
    WebPath = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=WebPath)
    driver.set_window_size(1024,768)
    
    driver.get("http://lyshark.com")
    
    # 通过xpath语法定位到用户名的标签上并且自动输入lyshark这个用户名
    driver.find_element_by_xpath("//form[@class='fms']/p//input[@id='user']").send_keys("lyshark")
    
    # 通过xpath语法定位到密码的标签上清空默认值,然后输入123123密码
    driver.find_element_by_xpath("//form[@class='fms']/p//input[@id='pass']").clear()
    driver.find_element_by_xpath("//form[@class='fms']/p//input[@id='pass']").send_keys("123123")
    
    # 提交这个请求,默认有两种提交方式一种是 click() 一种是submit()
    driver.find_element_by_xpath("//form[@class='fms']/input[@type='submit']").click()
    

    通过键盘鼠标类库记录并可回放

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.keys import Keys
    
    WebPath = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=WebPath)
    driver.set_window_size(1024,768)
    
    driver.get("https://www.baidu.com")
    
    # ------------------------------------------------------------------------
    # ActionChains 类提供了鼠标操作的常用方法,鼠标事件的常用函数说明
    # perform():        鼠标悬浮于标签
    # context_click():  右击
    # double_click():   双击
    # drag_and_drop():  拖动
    # move_to_element():鼠标悬停
    
    # 定位到要悬停的元素
    above = driver.find_element_by_link_text("更多产品")
    # 对定位到的元素执行鼠标悬停操作
    ActionChains(driver).move_to_element(above).perform()
    
    # ------------------------------------------------------------------------
    # webdriver.common.keys 类提供了键盘事件的操作,以下为常用的键盘操作:
    # send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
    # send_keys(Keys.SPACE) 空格键(Space)
    # send_keys(Keys.TAB) 制表键(Tab)
    # send_keys(Keys.ESCAPE) 回退键(Esc)
    # send_keys(Keys.ENTER) 回车键(Enter)
    # send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
    # send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
    # send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
    # send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
    # send_keys(Keys.F1) 键盘 F1
    
    # 输入框输入内容
    driver.find_element_by_id("kw").send_keys("seleniumm")
    # 删除多输入的一个 m
    driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
    # 输入空格键+从入门到入土
    driver.find_element_by_id("kw").send_keys(Keys.SPACE)
    driver.find_element_by_id("kw").send_keys("从入门到入土")
    
    # ctrl+a 全选输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
    # ctrl+x 剪切输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
    # ctrl+v 粘贴内容到输入框
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
    
    # 通过回车键来代替单击操作
    driver.find_element_by_id("su").send_keys(Keys.ENTER)
    

    简单的点击事件

    # -*- coding:utf-8 -*-
    from selenium import webdriver
    import time
    
    WebPath = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=WebPath)
    driver.set_window_size(1024,768)
    driver.get("https://www.baidu.com")
    
    driver.find_element_by_id("kw").send_keys("lyshark")  # 发送给id=kw的编辑框,搜索关键字 lyshark
    driver.find_element_by_id("su").click()               # 点击搜索按钮,百度一下的ID是su
    time.sleep(1)
    # xpath 语法 寻找 div id是1里面的 a标签取出标签中的 contains text()
    driver.find_element_by_xpath("//div[@id='1']//a[contains(text(),'-')]").click()
    time.sleep(1)
    
    handle = driver.current_window_handle   # 获取当前窗口句柄
    handle_all = driver.window_handles      # 获取当前所有开启窗口的句柄
    print(handle_all)
    driver.switch_to.window(handle_all[0])   # 切换到第一个窗口中
    time.sleep(1)
    driver.find_element_by_id("kw").clear()  # 接着清空搜索框中的内容
    

    百度自动收集

    from selenium import webdriver
    from bs4 import BeautifulSoup
    from queue import Queue
    import requests,os,re,lxml
    
    # driver: http://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/
    
    head = {"User-Agent":"Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3"}
    WebPath = "C:/Users/LyShark/AppData/Local/Google/Chrome/Application/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=WebPath)
    
    
    queue = Queue()
    for item in range(0,1000,10):
    	queue.put('https://www.baidu.com/s?wd={}&pn={}'.format("lyshark",str(item)))
    
    for item in queue.queue:
    	driver.get(item)
    	ret = str(driver.page_source)
    	try:
    		soup = BeautifulSoup(ret,'lxml')
    		urls = soup.find_all(name='a',attrs={'data-click':re.compile(('.')),'class':None})
    		for item in urls:
    		    get_url = requests.get(url=item['href'],headers=head,timeout=5)
    		    if get_url.status_code == 200:
    		        print(get_url.url)
    	except Exception:
    		pass
    

    页面等待

    from selenium import webdriver
    
    driver=webdriver.Chrome()
    driver.get('https://www.taobao.com/')
    wait=WebDriverWait(driver,3)  #设置监听driver等待时间3秒
    input=wait.until(EC.presence_of_element_located((By.ID,'q'))) #设置等待条件为id为q的元素加载完成
    button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))  #设置等待条件为class名为btn-search的元素加载完成
    print(input,button)
    
    driver = webdriver.Firefox()
    driver.implicitly_wait(10) #隐式等待设置为10等待时间
    driver.get("http://somedomain/url_that_delays_loading")
    myDynamicElement = driver.find_element_by_id("myDynamicElement")
    

    键盘操作

    element=driver.find_element_by_id('search')  #获取输入框
    element.send_keys('selenium')  #搜索selenium包
    element.send_keys(Keys.ENTER)  #按回车键
    
    element_a=driver.find_element_by_link_text('selenium') #定位selenium包链接
    
    ActionChains(driver).move_to_element(element_a).click(element_a).perform() #按左键点击链接执行
    
    element_down=driver.find_element_by_link_text('Download files')  #定位下载链接
    ActionChains(driver).move_to_element(element_down).click(element_down).perform()  #按左键点击链接
    
    element_selenium=driver.find_element_by_link_text('selenium-3.13.0.tar.gz')  #定位元素selenium下载包链接
    data=element_selenium.get_attribute('href')   #获取链接地址
    with open('selenium-3.13.0.tar.gz','wb') as f:
        source=requests.get(data).content   #请求下载链接地址获取二进制包数据
        f.write(source)  #写入数据
        f.close()
        
    driver.quit()
    
    menu = driver.find_element_by_css_selector(".nav") #获取element对象
    hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")  #获取点击对象
    #创建鼠标对象
    actions = ActionChains(driver)
    #移动鼠标到对象
    actions.move_to_element(menu)
    #点击对象
    actions.click(hidden_submenu)
    #执行操作
    actions.perform()
    
  • 相关阅读:
    CSS盒子模式(DIV布局快速入门)
    CSS中的滑动门技术
    由浅入深漫谈margin属性
    zz Apache 虚拟主机 VirtualHost 配置
    动态生成编译运行java类
    ubuntu 手动设置DNS服务器,重启后不能上网
    ubuntu下部署发布环境
    zz [Java]读取文件方法大全
    Ubuntu apache2 主机配置文件
    JAVA的CALLBACK
  • 原文地址:https://www.cnblogs.com/LyShark/p/12173220.html
Copyright © 2020-2023  润新知