Selenium实际应用注入并执行Javascript语句

2020-07-29 11:44:20 浏览数 (1)

Python通常结合selenium模块来完成一些web的自动化测试以及RPA(Robotic Process Automation)工作

事实上,Selenium还可以支持插入js语句、执行js语句、返回js语句的执行结果到python程序中。这对于那些已经习惯了Javascript语法的程序员们,简直是一大神器

我们简单看看在实际应用场景selenium如何应变各种难题执行JS语句

01

selenium原生的方法对页面的一个input元素执行输入时,通常需要用到selenium中的send_keys以及clear方法,

通常的写法:

代码语言:javascript复制
dr.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').clear()
dr.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').send_keys(" user_name")

该方法大多数时候已经足够好用,但是仔细分析,send_keys方法主要是模拟的用户键盘操作,程序执行时必须要保证该元素始终获取焦点,页面执行过程中尽量不能动页面,否则send_keys方法可能会失效。

而且我们每次send_keys之前需要对input元素已有的text进行清空,即初始化。笔者推荐使用JS注入selenium的方法来达到更好的效果,在selenium中写JS语句往往是如下形式:

JS写法

代码语言:javascript复制
js="document.getElementsByClassName('form-control')[0].value='%s';"%(requestCode[i][0].value)
dr.execute_script(js)

该方法,相当于是直接调用页面元素的value方法来进行赋值,不用考虑变量初始化问题,它属于网页后台功能,类似于F12直接在console中执行代码,不需要光标停留在该input元素上

02

想点查看网页的底部页面时,发现由于网页没有最大化导致元素隐藏定位失败,这里不用maximize_window(),我们用执行JS的方法来实现下。

首先我们来看一下这个页面,也是你们需要学习的文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollBy

我们打开发后如果不是全屏,底部的元素只能通过前端页面滑动进行查看,

selenium常规操作

在selenium中我们可以使用maximize_window()或者set_window_size()自定义浏览器大小

JS写法

代码语言:javascript复制
dr.execute_script('window.scrollBy(0,2000)')

实现逻辑

1.我们可以首先手动在页面打开F12打开console输入window.scrollBy(0.,20000) 执行看看是否能够滑动到页面底部如果可以正常滑动到页面底部,

2.我们在在selenium中执行我们上方的JS写法语句 就可以实现该页面滑动底部然后接着定位其它元素等操作,这种场景使用与很多后台或者底部翻页等被隐藏直接滑动下页面底部 执行翻页等功能操作

整体代码

代码语言:javascript复制
# -*-coding=utf-8-*-

import unittest
from selenium import webdriver
import os, time

dr = webdriver.Chrome()
dr.implicitly_wait(3)
url = 'https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollBy'
#打开网页#
dr.get(url)

#向右移动页面#
dr.execute_script('window.scrollBy(0,20000)')

03

这里针对于小编公司应用终端是植入在第三方系统上,例如我们公司有个H5应用就必须在企微授权获取对应员工工号才能登录,那么这种不能通过网页端正常登录的移动端应用我们用selenium在网页端如何进行登录操作呢

访问地址如下:https://sma.******.com.cn/view/index.html?state=from_qywx#/(由于是公司系统域名隐藏哈)正常在浏览器访问直接提示如下页面或者直接跳转到无权限

常规浏览器登录

常规想在网页端登录需要执行如下操作,输入地址,在local Storage进行输入用户token以及工号登录

那么想在网页端 通过selenium模拟登陆如何操作呢?我们来看看JS登录方法

实现逻辑

1.我们先可以使用selenium执行模拟用户输入防止访问跳入无权限页面后,我们进行使用JS方法execute_script()植入token,将植入的token缓存在浏览器中,我们此时再次请求登录地址,这时就会获取上次植入的token正常登录到H5应用界面,直接绕过登录,

整体代码

代码语言:javascript复制
# -*-coding=utf-8-*-

import unittest
from selenium import webdriver
import os, time


class test_login(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.dr = webdriver.Chrome()
        # 自定义浏览器分辩率 针对响应式页面,手机版等
        # cls.dr.maximize_window() #全屏
        cls.dr.set_window_size(600, 1000)  # 分辨率展示为597*802
        time.sleep(2)
        ulr1 = 'https://sma.******.com.cn/view/index.html?state=from_qywx#/login'
        # (u'访问百果秘书系统')
        cls.dr.get(ulr1)
        time.sleep(1)
        # 使用js/execute_script方法植入片区经理 工号******004 进行缓存
        cls.dr.execute_script('localStorage.setItem("token", ******004)')
        time.sleep(1)
        # 再次访问环境 进行登录
        ulr2 = 'https://sma.*******.com.cn/view/index.html?state=from_qywx'
        cls.dr.get(ulr2)

    @classmethod
    def tearDownClass(cls):
        time.sleep(2)
        cls.dr.quit()

    def test_case_001(cls):
        '''验证是否登录成功'''
        time.sleep(3)
        text = cls.dr.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[1]/div[1]/div[1]/h1/span').text
        cls.assertEqual(u'销售', text)


if __name__ == '__main__':
    unittest.main(verbosity=2)

selenium中执行JS场景简单介绍如上三个场景,平时工作中的运用之处进行总结分享,一是加深记忆,二是希望对于你们有所帮助。

0 人点赞