selenium 自动化测试登录,登录页面有一个随机图片,应该怎么处理?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium 自动化测试登录,登录页面有一个随机图片,应该怎么处理?相关的知识,希望对你有一定的参考价值。

参考技术A

随机图片其实就是验证码问题, 

目前测试环境解决验证码问题主要有几种: 

    OCR技术: 通过识别图片来破解验证码。但识别率不高, 若图片只是纯粹字母和数字组成的还好, 中文或者图形等则基本抓瞎.

    使用万能验证码,这种方法就是在判断验证的时候,如果遇到前台输入的是万能验证码,那就不要做验证码校验直接通过。 

    特定用户跳过验证码,这种方法就是如果遇到指定用户登录,那么不管输入什么验证码,验证码校验都通过。 

    使用hidden 控件在页面上显示验证码,就是在使用验证码的页面上,加入一个隐藏的控件,该控件的内容就是验证码。虽然用户看不到但是自动化测试工具可以找到该控件,并获得验证码。当然隐藏控件中的验证码也可以使用加密的方法,自动化测试脚本得到加密的验证后,可以通过解密操作解密验证码。 

上述的方法都需要开发对代码进行一定的修改,最好不要在生产环境上做,不然会造成安全漏洞。

参考技术B 无法处理,现有的技术都不能完美的解决登陆过程中的验证码问题
workaround:1,暂时停用验证码.2,固定验证码.3,当脚本运行到登陆时暂停,等待手动输入验证码
(纯手打,欢迎追问)
参考技术C 找资料中。。不知道什么情况

selenium自动测试常用脚本

一、控制已经打开页面的浏览器(已登录状态)

1、简述:

自动化执行时,一些页面操作需要用户是登录状态才能进行访问。如果每次运行自动化脚本都需要重新登录、输入短信验证码,不利于自动化快速运行。因此,需要自动化脚本,需要控制已经打开的页面对应的浏览器,进行自动化操作。

2、一般操作步骤:

1> 运行cmd,启动浏览器

2> 在打开的浏览器中手工进行登录

3> 运行python脚本,控制已经打开的浏览器,再进行后续操作

3、具体操作运行:

1)先在windows的cmd模式下运行以下代码,或者保存为.bat脚本点击运行;

运行成功后,会启动浏览器,打开一个标签页

start_chrome.bat脚本:

cd /d C:\\Users\\nikey\\AppData\\Local\\Google\\Chrome\\Application

chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\\selenum\\AutomationProfile"
pause
  • C:\\Users\\nikey\\AppData\\Local\\Google\\Chrome\\Application

        改为自己本地chrome安装目录

  • remote-debugging-port=9222

       指定的端口号(在后续python脚本中会使用,需指定未占用的端口号)         

  • user-data-dir="C:\\selenum\\AutomationProfile"

        自动化运行时指定的配置文件,这样不会覆盖用户的默认配置文件

2)通过指定端口号,控制已经打开的浏览器

from selenium import webdriver
import time

# 控制已经打开的浏览器,端口号使用cmd运行时指定的端口号
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
bro = webdriver.Chrome(options=chrome_options)
bro.maximize_window()

# 访问一个网页
url = 'https://www.baidu.com/'
bro.get(url)
time.sleep(1)

二、浏览器相关操作

1、自动化脚本运行完毕后,不自动关闭浏览器

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)  #不自动关闭浏览器
options.add_argument('--start-maximized')#浏览器窗口最大化
bro = webdriver.Chrome(options=options)
bro.get('https://www.baidu.com')

2、关闭浏览器标签页、退出浏览器

from selenium import webdriver

# 启动浏览器, 打开百度页面
bro = webdriver.Chrome()
url = 'https://www.baidu.com/'
bro.get(url)

# 关闭当前标签页
bro.close()

# 退出浏览器
bro.quit()

3、浏览器多个操作功能

1)打开新的标签页

2)切换到新的标签页

3)模拟鼠标滚轮滑动至页面底部

4)获取当前页面源码,通过关键字定位到需要截取的字段

from selenium import webdriver
import time


options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)  #不自动关闭浏览器
options.add_argument('--start-maximized')   #浏览器窗口最大化
bro = webdriver.Chrome(options=options)
url = 'https://www.baidu.com'
bro.get(url)
print(bro.title)

new_url = 'http://news.baidu.com/'
# 打开新的标签页
new_window = 'window.open("")'.format(new_url)  # js函数,此方法适用于所有的浏览器
bro.execute_script(new_window)

# 获取所有的句柄(打开新标签后,要重新获取窗口句柄)
windows = bro.window_handles
# 切换到 新打开的标签页
bro.switch_to.window(windows[1])
print(bro.title)

# 模拟鼠标滚轮,滑动页面至底部
js = "window.scrollTo(0, document.body.scrollHeight)"
bro.execute_script(js)  # 模拟鼠标滚轮,滑动页面至底部

# 获取当前页面的源码
page_text = bro.page_source
# print(page_text)

# 查找HTML页面中的关键字(页面中有多个,查找最后一个):upload_list_tr
key_str = 'upload_list_tr'
key_str_pos = page_text.rfind(key_str)
# print(key_str_pos)

# 通过字符串截取,找到fdId编号,通过fdId打开新的标签页
fdId = page_text[key_str_pos-41:key_str_pos-9]
# print(fdId)

new_file_url = 'http://news.baidu.com/view.jsp?fdId=' + fdId
print(new_file_url)
# 打开新的标签页
new_window = 'window.open("")'.format(new_file_url)  # js函数,此方法适用于所有的浏览器
bro.execute_script(new_window)
time.sleep(1)

# 关闭当前页面
# bro.close()

# 切换到 第一个打开的标签页
bro.switch_to.window(windows[0])
print(bro.title)

4、页面中内嵌iframe,定位iframe中的xpath

from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://www.XXXXXX.com'
bro = webdriver.Chrome()
bro.get(url)

# 切换到iframe中,才能识别数据的xpath标签
# 获取iframe的xpath
iframe_xpath = '/html/body/div[4]/div[1]/div/div/div[3]/div/div/div[2]/div/div[1]/div/div/iframe'
iframe = bro.find_element(By.XPATH, iframe_xpath)
# 获取iframe标签中的属性值
attr_value = iframe.get_attribute("kmss_fdid")
print(attr_value)
# 切换进入iframe中
bro.switch_to.frame(iframe)

# 定位到iframe中记录的xpath,点击记录
xpath = '/html/body/div[4]/div/div[4]/div[1]/div/div/table/tbody/tr[1]'
bro.find_element(By.XPATH, xpath).click()

常见问题解决方法:

1、Debugger Console 出现乱码

File Encoding 修改Project EncodingGBK即可。

以上是关于selenium 自动化测试登录,登录页面有一个随机图片,应该怎么处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何爬取淘宝登录页面

selenium自动化测试通过localstorage绕过登陆

python+selenium自动化写登录脚本时,弹出的第三方登录页面该如何定位元素?

selenium自动测试常用脚本

selenium自动测试常用脚本

自动化测试使用Java+selenium填写验证码成功登录