51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3602|回复: 2
打印 上一主题 下一主题

python+selenium实现登录账户后自动点击

[复制链接]
  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2018-2-7 17:20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
           公司在codereview的时候限制了看代码的时间,实际上不少代码属于框架自动生成,并不需要花费太多时间看,为了达标,需要刷点时间(鼠标点击网页固定区域)。我想到可以利用自动化测试的手段
    完成这种无效的体力劳动。
      首先,明确一下需求:   

    自动打开网页   
    登陆账号 
    每隔一定时间点击一下固定区域
    我想到的方案有两个,sikuli或者python+selenium。sikuli的优点是逻辑操作简单直接,使用图片作为标示,
    缺点是需要窗口固定,并且无法后台运行。selenium稍复杂一定,但是运行速度快,窗口可以遮挡。

      这里简单记录一下使用Python+selenium的小例子。
    使用的版本为Python3.3以及selenium2,Windows环境(现在已经支持3.0以上的了,多处论坛博客没有更新)。
      首先是软件的安装,Python不赘述了,记得设置环境变量。
      下面安装selenium,如果已经安装过pip。直接运行一下命令。
    1. pip install -U selenium
    复制代码
            另一种方式,https://pypi.python.org/packages ... enium-2.52.0.tar.gz下载
    并解压。这里简述一下windows版本,其实Unix下也差不多,使用Wget下载一下安装。
      使用命令(setup一般用于第三方模块的安装):
    1.  cd c:\Python3\xxxx
    2.   python setup.py install
    复制代码
           安装过程中可能会出现ImportError: No module named setuptools,这是因为缺少setuptools模块,
    Python默认不安装。
      在http://pypi.python.org/pypi/setuptools上面提供了各系统的安装包和安装指南,对于Windows系
    统,下载https://bootstrap.pypa.io/ez_setup.py自动化安装脚本。
      运行:
    1. python ez_setup.py
    复制代码
          完成后再安装selenium即可。
      如果你对selenium没有概念或者有其他疑问,可以参考文档。
      http://selenium-python.readthedo ... t/installation.html
      这里用我自己的实例简单的讲解一下流程。
      第一步先完成打开浏览器。
      selenium2结合了selenium和webdriver,直接引入各个浏览器相应的驱动,打开即可,注意chrome驱
    动可能需要另行安装。

    1. from selenium import webdriver
    2.   browser = webdriver.Firefox()
    3.   browser.get('https://www.xxx.com')
    复制代码
          打开网页后需要登录,F12打开浏览器调试器,小箭头选取元素,查看登录框账号和密码的属性,
    一般都有ID。selenium可以通过以下各个方法获取元素并进行各种操作,具体解释请看上方链接文档:


    find_element_by_id
    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

    其中id最为有效方便,优先考虑。选取完元素之后可以通过WebDriver API调用模拟键盘的输入和鼠
    标的点击操作。代码如下:
    1. username="qun"
    2. passwd="passwd"
    3. browser = webdriver.Firefox()
    4. browser.get('https://www.xxx.com')
    5. browser.implicitly_wait(10)
    6. elem=browser.find_element_by_id("loginFormUserName")
    7. elem.send_keys(username)
    8. elem=browser.find_element_by_id("loginFormPassword")
    9. elem.send_keys(passwd)
    10. elem=browser.find_element_by_id("loginFormSubmit")
    11. elem.click()
    复制代码
            一般登录之后页面都会跳转到新的网页上,如何获取新的网页呢?这里有个窗口句
    柄的概念,通过切换窗口句柄来完成。注意!有时候元素在一个frame里面的时候,也需
    要通过swtich切换。这里出现一个wait函数(上面也有),是因为页面加载需要时间,
    很可能在点击之后元素才加载出来,下一节详细解释一下wait。
    1. browser.implicitly_wait(10)
    2. browser.switch_to_window(browser.window_handles[-1])
    复制代码
           之后选取需要点击的区域,这里使用 xpath定位,因为在自动化测试的过程中,很有可能元素无
    法通过id,name等方法定位(不少人就是不写,爱table套table,我也么办法),xpath就有了用武之地。
    常用的偷懒方法是Firefox安装xpath插件,右键直接获取。这里不介绍,因为不提倡,使用插件会造成
    代码里充斥这样的东西:
    1. XPath(/html/body/div/div[3]/div[2]/div[4]/p[2])
    复制代码
          不到万不得已,尽可能使用元素的特征来定位,比如按钮的name。
    或者通过父元素定位子元素。

    1. username =browser.find_element_by_xpath("//input[@name='username']")
    2.  clear_button = browser.find_element_by_xpath("//form[@id='loginForm']/input[4]")
    复制代码
          代码如下,网上经常出现的By的用法需要引入包。
    1. from selenium.webdriver.common.by import By
    复制代码
          这里使用另外一个函数,我不知道有什么区别- -。
    1. for i in range(100):
    2.     elem=WebDriverWait(browser, 30).until(
    3.         lambda x:x.find_element_by_xpath("//table[@class='aaa']"/td[1]))
    4.     elem.click()
    5.     time.sleep(20)
    6.     print ("click",i)
    复制代码
           然后这里还要提一下wait函数,在selenium2中延迟等待分为两种,显示等待和隐式等待。
    显示等待

      显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在
    规定的时间之内都没找到,那么就跳出Exception。

    1. element = WebDriverWait(driver, 10).until(
    2.         EC.presence_of_element_located((By.ID, "myDynamicElement"))
    3.     )
    复制代码
          隐式等待
      注意,隐式等待是告诉设置所有dom元素在寻找某个元素的时候,如果没立即找到,再尝试这么长时间。

    1. browser.implicitly_wait(10) # seconds
    复制代码
           两者的区别在于一个是自己直接管理超时对象,一个是交给webdriver去做。   当然也可以用休眠的方法干等。记得引入time包。
    1. time.sleep(20)
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-6 14:59
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]测试排长

    2#
    发表于 2018-2-8 08:26:52 来自手机 | 只看该作者
    楼主写的挺好的
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 15:15 , Processed in 0.067087 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表