Selenium应用系列2

学点Selenium玩点新鲜~,让分布式测试有更多玩法 standalone 模式能够在一台机器上面执行完整的分布式功能,是 Selenium Grid 的最简单的模式,默认情况下,服务会在 http://localhost:4444 地址监听,我们需要通过 RemoteWebDriver 指向这个地址。上述示例客户端脚本和 Grid 服务都是在本机,当然在实际应用中我们可以将 Grid 服务和脚本分别部署在两台主机上,此时脚本中指向的地址:http://localhost:4444/换成 Grid 服务所在主机的对外 IP 地址即可。 阅读详情

一. Selenium背景与概念

Selenium是一个Web应用程序测试工具。Selenium测试直接运行在浏览器中,支持.Net、Java、Perl、Python等不同语言的测试脚本。

因为各大应用平台没有对应的服务发布接口,sdk也没有覆盖相应的功能,所以此处转换了一种思路,使用Selenium操作各应用平台的web页面间接实现app发布的功能。各大应用商像 “360开放平台”,“腾讯应用宝”,“VIVO应用商店”,“OPPO软件商店”,“百度开放平台”,“小米”,“华为”,“魅族”,"阿里应用分发开放平台"等,此处以腾讯应用平台为示例,实现app发布功能

二. Selenium组成

  • Selenium Hub :也叫做 Selenium Server,用来接收服务请求,并将收到的请求转发给相应的node执行测试请求。
  • Selenium Node :Selenium任务执行的主体,用来接收Server发过来的任务,并调用相应的浏览器执行测试请求。
  • Python test :编写任务,并将任务发送给 Selenium Hub。

三. Selenium搭建

1. java环境准备,此处不做详解,Hub/node都需要。

2. Selenium Hub搭建

  1. 下载 selenium-server-standalone jar 包:/data/sel/selenium-server-standalone-2.42.2.jar
  2. 准备 selenium配置文件 /data/sel/config.json
    {
    "host": null,
    "port": 4444,
    "prioritizer": null,
    "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
    "throwOnCapabilityNotPresent": true,
    "newSessionWaitTimeout": -1,
    "jettyMaxThreads": -1,
    "nodePolling": 5000,
    "cleanUpCycle": 5000,
    "timeout": 30000,
    "browserTimeout": 0,
    "maxSession": 5,
    "unregisterIfStillDownAfter": 30000
    }
    
  3. 启动 Selenium Hub服务
    #] java -jar /data/sel/selenium-server-standalone-2.42.2.jar -role hub -hubConfig /data/sel/config.json
    Sep 29, 2020 5:07:15 PM org.openqa.grid.selenium.GridLauncher main
    INFO: Launching a selenium grid server
    2020-09-29 17:07:16.404:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT
    2020-09-29 17:07:16.427:INFO:osjsh.ContextHandler:started o.s.j.s.ServletContextHandler{/,null}
    2020-09-29 17:07:16.435:INFO:osjs.AbstractConnector:Started SocketConnector@0.0.0.0:4444
    

    有监听端口提示后,代表 Selenium Hub服务端搭建启动完成

3. Selenium Node搭建

  1. 下载 selenium-server-standalone jar 包:D:\apps\selenium-server-standalone-2.42.2.jar

  2. 安装谷歌浏览器

  3. 安装 chromedriver.exe 谷歌浏览器驱动:D:\apps\chromedriver.exe

  4. 准备 selenium配置文件 D:\apps\config.json

    {
      "capabilities": [
        {
          "browserName": "*googlechrome",
          "maxInstances": 1,
          "seleniumProtocol": "Selenium"
        },
        {
          "browserName": "chrome",
          "maxInstances": 1,
          "seleniumProtocol": "WebDriver"
        }
      ],
      "configuration": {
        "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
        "maxSession": 1,
        "port": 5555,
        "register": true,
        "registerCycle": 5000
      }
    }
    
  5. 打开cmd,启动 Selenium Node服务

    java -Dwebdriver.chrome.driver=D:\apps\chromedriver.exe -jar D:\apps\selenium-server-tandalone-2.42.2.jar -nole node -host 本机地址 -hub http://HUB地址:4444/grid/register -nodeConfig D:\apps\config.json
    9月 29, 2020 5:14:34 下午 org.openqa.grid.selenium.GridLauncher main
    信息: Launching a selenium grid node
    17:14:35.101 INFO - Java: Oracle Corporation 15+36-1562
    17:14:35.101 INFO - OS: Windows 10 10.0 amd64
    17:14:35.105 INFO - v2.42.2, with Core v2.42.2. Built from revision 6a6995d
    17:14:35.144 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:5555/wd/hub
    17:14:35.145 INFO - Version Jetty/5.1.x
    17:14:35.145 INFO - Started HttpContext[/selenium-server,/selenium-server]
    17:14:35.175 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@71c3b41
    17:14:35.175 INFO - Started HttpContext[/wd,/wd]
    17:14:35.176 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
    17:14:35.176 INFO - Started HttpContext[/,/]
    17:14:35.177 INFO - Started SocketListener on 0.0.0.0:5555
    17:14:35.177 INFO - Started org.openqa.jetty.jetty.Server@3ce1e309
    17:14:35.178 INFO - using the json request : {"capabilities":[{"seleniumProtocol":"Selenium","browserName":"*googlechrome","maxInstances":1,"platform":"XP"},{"seleniumProtocol":"WebDriver","browserName":"chrome","maxInstances":1,"platform":"XP"}],"configuration":{"role":"node","remoteHost":"http://192.168.89.1:5555","hubHost":"192.168.89.133","hubPort":4444,"nodeConfig":"D:\\apps\\config.json","url":"http://192.168.89.1:5555","proxy":"org.openqa.grid.selenium.proxy.DefaultRemoteProxy","hub":"http://192.168.89.133:4444/grid/register","port":5555,"host":"192.168.89.1","maxSession":1,"registerCycle":5000,"register":true},"class":"org.openqa.grid.common.RegistrationRequest"}
    17:14:35.178 INFO - Starting auto register thread. Will try to register every 5000 ms.
    17:14:35.178 INFO - Registering the node to hub :http://hub地址:4444/grid/register
    
    

    有这样的提示,代表Selenium node启动成功。

    注意 :node与hub直接网络互通,如果无法访问,则不能连接

4. Python 任务编写运行

  1. 安装selenium
    #] pip3 install selenium
    
  2. 编写python脚本 qqplatform.py
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.webdriver.common.by import By
    import time
    
    class QQPlatform():
        def __init__(self):
            self.url = "https://open.qq.com/login"
            self.username = "username"
            self.password = "password"
            self.hub = 'hub地址'
            self.browser = webdriver.Remote(
                command_executor='http://%s:4444/wd/hub'%(self.hub),
                desired_capabilities=DesiredCapabilities.CHROME)
            self.browser.maximize_window()
    
        def login(self):
            print("开始登录")
            self.browser.get(self.url)
            time.sleep(0.2)
            self.browser.implicitly_wait(30)
            self.browser.switch_to.frame('login_frame')
            self.browser.find_element_by_id("switcher_plogin").click()
            time.sleep(0.2)
            self.browser.find_element_by_id("u").send_keys(self.username)
            self.browser.find_element_by_id("p").send_keys(self.password)
            time.sleep(0.2)
            self.browser.find_element_by_id("login_button").click()
            WebDriverWait(self.browser,15).until(lambda the_driver: the_driver.find_element_by_id('_leftSidebar').is_displayed())
            print("登录成功")
    
        def upload(self,apk):
            # 新功能
            print("开始上传")
            apkName=apk.split('/')[-1]
            handle = self.browser.current_window_handle
            self.browser.find_element_by_class_name('cover').click()
            self.browser.find_element_by_partial_link_text('更新安装包').click()
            print(self.browser.current_url)
            handles=self.browser.window_handles
            for newhandle in handles:
                if newhandle != handle:
                    self.browser.switch_to.window(newhandle)
            print(self.browser.current_url)
            try:
                self.browser.find_element_by_class_name("webuploader-element-invisible").send_keys(apk)
                self.browser.implicitly_wait(20)
            except:
                print("软件包上传失败")
                exit(2)
            # 下一步: 待优化
            time.sleep(30)
            # verifyTextPresent(pattern):校验当前页面是否出现该文字
            # WebDriverWait(self.browser, 30).until(
            #     lambda the_driver: the_driver.find_element(By.XPATH, '//p[text()="%s")]'%(apkName)).is_displayed())
            print("软件包上传成功")
    
        def submit(self,isTest):
            print("开始发布")
            self.browser.find_element_by_id('j-submit-btn').click()
            time.sleep(3)
            if isTest:
                # 测试打开
                self.browser.find_element_by_class_name('j-confirm-no').click()
            else:
                # 正式使用打开
                self.browser.find_element_by_id('j-confirm-yes').click()
            time.sleep(1)
            print("软件包已发布")
    
        def close(self):
            time.sleep(2)
            print("退出浏览器")
            time.sleep(2)
            self.browser.quit()
            print("应用发布结束")
    
    if __name__ == '__main__':
        apk="/data/apks/_V_2.0.7_300_2020-09-27.apk"
        isTest=True
        qq = QQPlatform()
        qq.login()
        qq.upload(apk=apk)
        qq.submit(isTest=isTest)
        qq.close()
    
  3. 运行python脚本
    #] python3 qqplatform.py
    

四. Selenium取消浏览器页面控制提示

selenium打开浏览器后,会有 浏览器受selenium控制 的提示,添加如下配置,则可隐藏这个提示

from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Remote(
            command_executor='http://hub:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME,
            options=option
        )

此类配置并不能影响window.navigator.webdriver的值,只要使用selenium,此值仍然为true。

五. Selenium 控制浏览器标签页相关操作

方法说明
set_window_size()设置浏览器的大小
maximize_window()最大化浏览器
refresh()刷新当前页面
clear()清除文本
send_keys(value)模拟按键输入
click()单击元素
is_displayed()设置该元素是否用户可见
get_attribute(name)获取元素属性值
back()控制浏览器后退
forward()控制浏览器前进
size返回元素的尺寸
text获取元素的文本
switch_to.frame(id)切换到指定iframe框
current_url获取当前浏览器url
current_window_handle获取当前浏览器句柄
window_handles获取当前浏览器所有句柄
switch_to.window(newhandle)获取新的浏览器句柄
switch_to.default_content()返回iframe上一层

六. Selenium 验证码识别技术

1. 介绍

很多网站都会做Selenium自动化识别,你手动登录的时候无需验证码直接登录,但是当你使用Selenium控制登录时就会有各种各样的验证码操作,此处只针对<字母数字干扰>验证码图做讲解

2. 百度图像识别API服务

  • 文档地址: https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
  • vin码识别地址: https://cloud.baidu.com/doc/OCR/s/zk3h7y51e

3. 百度图片识别API服务操作

  1. 获取 client_id 和 client_secret
    • 登录 百度智能云
    • 进入 控制台 > 图像识别 > 创建应用(例:vin码识别) > 填写相应内容 > 立即创建 > 应用列表 > 根据名称可以找到API Key 和 Secret Key
      avatar
      avatar
      avatar
    • client_id 就是 API Key,client_secret 就是 Secret Key
  2. 通过API Key和Secret Key获取的access_token
    import requests
    
    client_id = "xxx"
    client_secret = "jjj"
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s' % (
                client_id, client_secret)
    response = requests.get(host)
    if response:
      res1 = response.json()
      access_token = res1['access_token']
    
  3. 通过 access_token 获取验证码
    import requests
    import base64
    
    f = open('/data/03.png', 'rb')
    img = base64.b64encode(f.read())
    params = {"image": img}
    
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vin_code"
    access_token = "xxxaaafff"
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    res = response.json()
    if "words_result" in res.keys():
      words_result = res['words_result']
      words = words_result[0]['words']
    

4. Selenium 使用 百度图像功能 集成验证码识别

# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
from PIL import Image, ImageEnhance
import requests
import base64
from selenium.webdriver import ChromeOptions

class TreePlatform():
    def __init__(self):
        ""
        self.url = "http://dev.360.cn/"
        self.username = "xxx"
        self.password = "yyy"
        self.hub = '192.168.89.133'
        self.option = ChromeOptions()
        self.option.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.browser = webdriver.Remote(
            command_executor='http://%s:4444/wd/hub' % (self.hub),
            desired_capabilities=DesiredCapabilities.CHROME,
            options=self.option
        )
        self.browser.maximize_window()
        self.num = 0

    def checkYZM(self):
        self.num += 1
        self.browser.save_screenshot("/data/01.png")
        imgElement = self.browser.find_element_by_class_name('quc-captcha-img')
        ran = Image.open("/data/01.png")
        left = imgElement.location['x']  # 区块截图左上角在网页中的x坐标
        top = imgElement.location['y']  # 区块截图左上角在网页中的y坐标
        right = left + imgElement.size['width']  # 区块截图右下角在网页中的x坐标
        bottom = top + imgElement.size['height']  # 区块截图右下角在网页中的y坐标
        box = (left, top, right, bottom)
        ran.crop(box).save("/data/02.png")
        imageCode = Image.open("/data/02.png")
        sharp_img = ImageEnhance.Contrast(imageCode).enhance(2.0)
        sharp_img.save("/data/03.png")
        sharp_img.load()  # 对比度增强
        time.sleep(2)
        request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vin_code"
        # request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage_loc"
        # 二进制方式打开图片文件
        f = open('/data/03.png', 'rb')
        img = base64.b64encode(f.read())
        params = {"image": img}
        # 获取百度图片验证的access_token
        client_id = "xxxxxx"
        client_secret = "yyyyyy"
        host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s' % (
            client_id, client_secret)
        response = requests.get(host)
        access_token = "afaefefadf"
        if response:
            res1 = response.json()
            access_token = res1['access_token']
        # access_token = '24.6446d03681246f106b5778014157565c.2592000.1588924992.282335-19323883'
        request_url = request_url + "?access_token=" + access_token
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        response = requests.post(request_url, data=params, headers=headers)
        res = response.json()
        print(res)
        if "words_result" in res.keys():
            words_result = res['words_result']
            if len(words_result) >= 1:
                words = words_result[0]['words']
                return words
            else:
                return -1
        else:
            return -1

    def whileCheckYZM(self):
        if self.num >= 20:
            print("尝试次数过多,已退出,请手动发布")
            exit(2)
        result = self.checkYZM()
        print("result", result)
        if result == -1:
            self.browser.find_element_by_class_name("quc-captcha-change-link").click()
            return self.whileCheckYZM()
        else:
            print(result)
            if len(result) <= 3:
                self.browser.find_element_by_class_name("quc-captcha-change-link").click()
                return self.whileCheckYZM()
            self.browser.find_element_by_name('phrase').clear()
            self.browser.find_element_by_name('phrase').send_keys(result)
            time.sleep(3)
            self.browser.find_element_by_class_name("quc-button-sign-in").click()
            time.sleep(3)
            try:
                if self.browser.find_element_by_class_name('quc-tip-error').is_displayed():
                    return self.whileCheckYZM()
            except:
                print("登录成功")

    def login(self):
        print("开始登录")
        self.browser.get(self.url)
        time.sleep(0.2)
        self.browser.implicitly_wait(30)
        self.browser.find_element_by_class_name("js-signIn").click()
        time.sleep(0.2)
        self.browser.find_element_by_name("account").send_keys(self.username)
        self.browser.find_element_by_name("password").send_keys(self.password)
        time.sleep(2)
        # 难点: 输入验证码 请输入验证码 可见,则需要输入验证码
        self.browser.find_element_by_class_name("quc-button-sign-in").click()
        try:
            if self.browser.find_element_by_class_name('quc-tip-error').is_displayed():
                self.whileCheckYZM()
        except:
            print("登录成功")

    def close(self):
        time.sleep(2)
        print("退出浏览器")
        self.browser.quit()

七. Selenium跳过登录验证

1.使用 cookies 屏蔽 selenium 登录验证问题

  1. 操作流程

    • 打开要测试的网页,获取登录前的cookie(可以抓包获取,可以代码实现,下面会附上代码)。
    • 手动登录,再获取登录后的cookie。
    • 对比两次获取的cookie,找出登录后多出来的cookie,只要多出来的name和value就行(一般name就是token)。
    • 在代码里加上写入cookie,把找出来的name和value写入。然后再写一遍打开网页的代码。

    可以删除某个cookie,刷新看看影响登录状态不,如果影响,则需要找出,精简,越少越好

  2. 通过浏览器获取当前网站的cookies

    • control控制台: document.cookie,将结果复制到字符串中
  3. 脚本配置

    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    bro=webdriver.Remote(
               command_executor='http://192.168.89.144:4444/wd/hub',
               desired_capabilities=DesiredCapabilities.CHROME,
               options=option
           )
    bro.get('http://www.xxx.com')
    bro.delete_all_cookies()
    cookie_str="Hm_lvt_15a5a39cc30c333ba9fae9270351ef30=1603075219,1603075249,1603075436,1603076535; Hm_lpvt_15a5a39cc30c333ba9fae9270351ef30=1603076844; HW_refts_developer_huawei_com/consumer_developer_huawei_com=1602816770937; HW_id_developer_huawei_com/consumer_developer_huawei_com=83c25345ea61434d85d371a96e1f914d; HW_idts_developer_huawei_com/consumer_developer_huawei_com=1602816770938; HW_idn_developer_huawei_com/consumer_developer_huawei_com=0eaa0805460b40e2a03dfccf964e80c7; HW_viewts__developer_huawei_com=1603075212712; _ga=GA1.2.1762325546.1603075273; _gid=GA1.2.69869945.1603075273; urlBeforeLogin=https%3A%2F%2Fdeveloper.huawei.com%2Fconsumer%2Fcn%2F; state=2127401; hwsso_login=""; Hm_lvt_48e5a2ca327922f1ee2bb5ea69bdd0a6=1603075273,1603076561; Hm_lpvt_48e5a2ca327922f1ee2bb5ea69bdd0a6=1603076825; X-HD-SESSION=737a07c5-0b9d-b4c0-22f8-a688197a5093; x-uid=890086000102320858; x-siteId=1; x-hd-grey=0; developer_userinfo=%7B%22siteid%22%3A%221%22%2C%22expiretime%22%3A%2220201019T040721Z%22%2C%22csrftoken%22%3A%225FA3FBE57EE0CA455F2E782A7FD528A84C26D0C31FF2C0F0FE%22%7D; HW_viewts_developer_huawei_com/consumer_developer_huawei_com=1603076842837; x-userType=2; HW_idvc_developer_huawei_com/consumer_developer_huawei_com=43"
    cookis_list=cookie_str.split('; ')
    for item in cookis_list:
        cookie={u'domain': u'.developer.huawei.com',u'httpOnly': False,u'name': item.split('=')[0],u'path': u'/',u'secure': False,u'value': item.split('=')[1]}
        bro.add_cookie(cookie)
    bro.refresh()
    
  4. 该方案缺点

    • 该方法只能解决部分网站的登录,并不是所有的网站都能使用 cookies 实现登录;
    • cookies有时间限制,超时需要重新手动登录生成新的cookies并更新到代码中。
selenium源码通读·9 DesiredCapabilities类分析_desiredcapabilities selenium Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上;Selenium Grid 主要使用 master-slaves (or hub-nodes) 理念 ,是一个 master/hub 和多个基于master/hub注册的子节点 slaves/nodes;在master上基于不同的浏览器/系统运行测试用例时,master将会分发给适当的node运行; 阅读详情

相关推荐

selenium3源码解析Python篇(七)-DesiredCapabilities源码解析

讲解这篇之前,我们先要看下什么是selenium grid: Selenium grid是用来分布式执行测试用例脚本的工具,由一个中心节点hub控制,分发到不同node上。 那么DesiredCapabilities是什么: 根据测试代码中配置的DesiredCapabilities参数,来决定将测试代码分发到哪台node上进行测试 简单的例子: 在此之前:我们需要下载对应selenium版本的...

m0_37623792的博客 2012

selenium hub集群部署

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。本文介绍selenium单机以及集群的安装步骤。

勿忘初心方得始终 1388

Selenium2 Python 自动化测试实战学习笔记(二)

4.6 获得验证信息 通常我们用得最多的几种验证信息分别是title、url和text,text方法它用于获取标签对应的文本信息。 下面用126邮箱例子,来获取这些信息:Login126.py #coding=utf-8 From selenium import webdriver   Driver=webdriver.Chrome() Driver.get(“http:/

WEL测试 1万+

05-04 docker 搭建 Selenium Hub

相关参考链接: https://ceshiren.com/t/topic/10489 https://github.com/SeleniumHQ/docker-selenium 启动 Grid hub # 拉取镜像 docker pull selenium/hub # 运行 docker run --name=hub -p 5001:4444 -e GRID_TIMEOUT=0 -e GRID_THROW_ON_CAPABILITY_NOT_PRESENT=true -e GRID_NEW_SESSION_

Leo-Fighting的博客 1375

【原创】Selenium学习系列之(五)—从Selenium 到 Selenium2(Webdriver)

通过前面四期,大家对Selenium应该有了初步的了解,它是一个强大的基于浏览器的开源自动化测试工具。在使用一段时间后,你会觉得Selenium确实是一个很不错的Web测试工具,它使用灵活简单,上手快,而且写出的测试case非常简洁,并且支持多个编程语言。 但Selenium并不是能够在浏览器中自动化功能测试的唯一工具。由SimonStewart创建的webdriver是一个具有类似目标的项目。

Summary 1233

Selenium初级 | 使用navigate系列方法操作网页

前面我们学了使用get系列方法去打开网页,获取页面标题等,使用navigate系列的方法也可以打开网页,还可以在不同的页面间进行切换,比如前进到上一个页面,回退到下一个页面。 这些操作和get系列方法不同的是,get系列方法每一个都是全新的操作,相当于自带了一个默认的刷新页面的功能,而navigate系列的方法是基于浏览器的历史记录在操作。 本篇文章介绍四个最常用的navigate系列的方法:...

YOYO的博客 8992

[Robot Framework] 学习资料

https://www.cnblogs.com/pachongshangdexuebi/category/981644.html Robot Framework学习笔记(一)------环境搭建 Robot Framework 学习笔记(二)-------第一个脚本 Robot Framework学习笔记(三)------常用关键字介绍 Robot Framework学习笔记(四)-...

weixin_30709929的博客 150

Selenium Java框架2.18.0版本深度解析及应用

本文还有配套的精品资源,点击获取 简介:Selenium 2.18.0是一个历史悠久的版本,但其核心组件和功能仍然对当前的Web自动化测试具有指导意义。该版本包含了Selenium Core的操作接口,WebDriver的跨浏览器测试功能,以及为Java开发人员提供的API。它支持多种浏览器,集成TestNG/JUnit框架,并提供了丰富的元素定位方法和断言验证机制。了解这...

weixin_42465140的博客 1420

Selenium应用系列1

Selenium应用一. Selenium背景与概念二. Selenium组成三. Selenium搭建1. java环境准备,此处不做详解,Hub/node都需要。2. Selenium Hub搭建3. Selenium Node搭建4. Python 任务编写运行 一. Selenium背景与概念 Selenium是一个Web应用程序测试工具。Selenium测试直接运行在浏览器中,支持.Net、Java、Perl、Python等不同语言的测试脚本。 因为各大应用平台没有对应的服务发布接口,sdk也没有

mx_steve的博客 487

2025软考中级《数据库系统工程师》案例模拟题合集

1.【说明】某销售企业正在实施电商平台项目,主要功能模块包括用户中心、商品中心、交易中心、支付中心、营销中心等。其中支付中心模块包括了一个账户表:Account (ano, aname, balance),其中属性含义分别为:账户号,账户名称和账户余额。 假设现在存在事务Ti对账户表Account进行余额的修改,系统记录了修改账户表的日志记录,假设更新日志记录表示为 <Ti,A,V1,V2>,表明事务Ti对账户A执行了一个写操作,写操作前账户A的余额是V1,写操作后账户A的余额为V2。<Ti,D

2301_76902257的博客 2325

0032期基于深度学习的大米识别-含数据集

083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。

grehtsfrs的博客 1504

Selenium2Library

注:该文章涉及到的命令为实习中学习的一些容易忘记的,其中包括 基本命令/Selenium2Library/DatabaseLibrary/DateTime/HttpLibrary.HTTP/OperateRedis 基本命令 log和log many log和log many分别使用于Scalar变量和List变量,相当于print和cout<< Selenium2Lib...

zangba9624的博客 1555

信捷CODESYS平台伺服电机转矩控制模式应用与切换

信捷CODESYS二次开发软件:XS Studio 在运动控制中的转矩控制案例

weixin_64614866的博客 1万+

Selenium学习(七) selenium IDE命令之 store系列详解

assert系列简介 使用断言,测试用例将会在断言失败后停止运行 优点:可以直接直接了当的看到检查是否通过 缺点:若检查失败,后续的检查不会被执行,无法收集检查的结果状态 相关方法 store store attribute store json store text store title store value store window handle store xpath count 官方API store Save a target string as a variable ..

4335

生信实战|EffectorP3.0在植物病原菌效应子预测中的高效应用

本文详细介绍了EffectorP 3.0在植物病原菌效应子预测中的高效应用。通过机器学习模型,该工具能快速从海量分泌蛋白中批量预测胞质与质外体效应子,显著提升研究效率。文章提供了从环境配置、RNA-seq数据处理到批量预测的完整实战流程,并分享了结果解读与避坑指南,是生信研究人员进行病原物效应子鉴定的必备利器。

weixin_29195615的博客 299

Python全栈入门到实战【JavaScript篇 15】async/await与Fetch API,打通前后端数据通道

Fetch API是浏览器内置的现代HTTP请求接口,用于向服务器发送请求并获取响应。它是(XHR)的替代品。学习Fetch的目标非常明确——用JS从后端API获取数据,并渲染到前端页面。这标志着前后端数据通道的打通,是实现全栈开发的核心技能。try {// 等待Promiseconst parallel = await Promise.all([ // 并行等待]);

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1976

android自动化测试

Android集成测试框架 Robotium编辑/纠错 分享到  新浪微博腾讯微博 已用    +2 收藏 +35 程序员必上的开发者服务平台 —— DevStore robotium 是 Android 平台上类似 Selenium 的集成测试工具。有JUnit基础的开发者,还是非常容易上手的。 Robotium 是一款国外的And

qyjandroid的专栏 703

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6885

Selenium私房菜系列1 -- Selenium简介

这里没有介绍Selenium Grid,但介绍了另外一个Selenium Core HTA,Selenium Core HTA其实是Selenium Core的额外模式,你只要Selenium Core配置稍加修改,即为HTA模式,Selenium Core HTA可以在IE最高安全等级(特权)下工作,这意味着它仅能在IE下工作,由于限制较大,下面将排除对Selenium Core HTA的讨论。这里不说了,都支持。(2).Selenium RC支持很多语言,如:C#,Java,Python,Ruby等。

SherryJin的博客 506

基于深度学习YOLOv10的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

本文介绍了如何基于YOLOv10实现一个人脸表情识别系统。我们从数据集准备、模型训练到PySide6界面实现进行了详细的讲解。通过该系统,用户可以实时检测和分类人脸表情,为情感分析、智能交互等应用场景提供支持。

YOLO 1053

Unity接入抖音小程序侧边栏

Unity接入抖音小程序侧边栏功能实践总结 本文分享了Unity游戏接入抖音小程序侧边栏复访功能的实现过程。针对官方文档不清晰的问题,作者详细介绍了关键实现步骤:通过TT.CheckScene检测侧边栏可用性,利用OnShow事件监听判断用户是否从侧边栏进入,并提供了完整的UI交互代码示例。重点功能包括:检测宿主版本支持、区分侧边栏入口与非侧边栏入口的界面展示、实现跳转侧边栏场景等。文中附有官方文档链接和效果截图,为开发者提供了实用的接入参考方案。

类人_猿的博客 612

Web自动化系列--Selenium2框架概述

Selenium可以让浏览器自动执行各种Web应用。它目前主要用于Web端的自动化测试,但它并不仅仅局限于此。它还可以用于自动化管理基于Web的各种无聊费时的任务。 Selenium目前被一些使用广泛的浏览器厂商所支持,并作为功能的一部分加入到了浏览器中。它也是无数其他测试工具、API和框架的核心技术支撑。

龙马战枫的专栏 439

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Selenium在爬虫中的应用

Selenium 是一个用于 Web 应用程序测试的工具,它可以模拟用户与浏览器的交互,支持多种语言和浏览器。

m0_73673163的博客 1982

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RFS的web自动化验收测试—介绍篇

引言:什么是RFS——RobotFramework+selenium2library,本系列主要介绍web自动化验收测试方面。   == RobotFramework的一些特性==   易于使用,采用表格式语法,统一测试用例格式;   重用性好,可以利用现有关键字来组合新关键字;   支持变量;   支持创建基于数据驱动的测试用例。   结果报告和日...

weixin_34124651的博客 193

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python selenium框架原理_Selenium2 框架概述

我自己是自动化测试的小菜鸟,接触这个领域不到1年时间,没有实践经验,目前的只在实习项目中学习到了一些相关知识。想通过写文章的方式归纳总结,让自己对这段时间的学习有一个沉淀。【Selenium2简介】官网的说明:Selenium automates browsers. That's it! What you do with that power is entirely up to you. Prim...

weixin_39582724的博客 292
上一篇: Selenium应用系列1
下一篇: GlusterFS 应用
mx_steve
博客等级 码龄8年 57粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值