Selenium连接远程服务器

最近学习了一下自动化测试工具selenium,基础的使用感觉不是太难,
在学习的过程中,我碰到了新需求,我需要本地执行的selenium代码打开远程服务器的浏览器去执行测试代码

1.本地selenium的工作流程:
selenium有很多版本,其中selenium2和selenium4版本区别很大,同样的代码并不一定能在两者中都能执行

我本地的python执行selenium2的代码,selenium2代码中需要配置本地的浏览器的路径,以及浏览器的驱动地址
而selenium4中并不需要如此配置,可能内部代码自动寻找本机安装的浏览器路径和内置了浏览器驱动
下面是我的基本代码:

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


def test():
    # 1.连接本地浏览器
    chrome_options = webdriver.ChromeOptions()
    chrome_options.page_load_strategy = 'normal'
    chrome_options.add_experimental_option("detach", True)
    # 想打开谷歌浏览器需要使用谷歌驱动
    executable_path = "D:\\selenium\\chromedriver.exe"
 		# 谷歌浏览器的所在地   
		chrome_options.binary_location="C:\\Users\\Coco\\AppData\\Local\\Chromium\\Application\\chrome.exe" 
    driver = webdriver.Chrome(executable_path=executable_path, chrome_options=chrome_options)
    # 隐式等待,每一个元素获取,如果没有立刻获取到,则等待最多2秒
    driver.implicitly_wait(2)

    # 2.执行操作
    
    # 3.关闭实例
    driver.quit()

selenium代码操作浏览器驱动,浏览器驱动才真正操作浏览器,从而实现测试代码的一些行为
所以浏览器驱动的版本与浏览器的版本一定要相匹配,在大版本上要匹配,之后我会贴出各个文件下载地址

2.连接远程selenium的工作流程:
上面是基于本地执行selenium代码,如果你想在本地执行selenium代码,从而控制其他机器中的浏览器执行自动化测试
那有两种方式实现

  • 第一种是使用Selenium Grid的方式,它可以在多个机器的浏览器上执行自动化测试
  • 第二种是独立部署Selenium standalone服务端,如果你只需要在某单个远程服务器的浏览器上进行自动化测试
    而不是同时在不同的机器上测试,那你可以使用这种方式

下面将记录一下第二种方式,实现selenium连接远程服务器的浏览器,从而执行自动化测试

首先我们需要在远程服务器部署Selenium standalone服务端,它是一个java程序,需要java环境,
通过java -jar命令即可启动,我把启动命令弄成了window脚本,双击即可启动selenium服务端

@echo off
java -jar selenium-server-standalone-2.46.0.jar -timeout=20 -browserTimeout=60 -Dwebdriver.chrome.driver=C:\Users\icbc\Desktop\wanyi\chromedriver.exe


# 部署完毕后检查是否启动正常,访问:http://192.168.1.223:4444/wd/hub/static/resource/hub.html
# 上面代码中不仅是启动了selenium服务端,而且指定了远程服务器中浏览器驱动所在地,
# 浏览器驱动会自动寻找版本相匹配的浏览器,从而执行自动化测试

我们本地执行的selenium代码被称为客户端,当启动selenium服务端后,通过执行本地selenium代码
连接到远程的selenium服务端,我们的自动化测试命令被远程服务端接收后,会去调用远程的浏览器驱动
而远程的浏览器驱动也会去找版本相匹配的浏览器去执行自动化测试代码,下面是selenium2的代码实现:

def test():
    # 1.设置远程Selenium服务器的URL和端口号,4444是selenium-standalone的默认端口号
    remote_server_url = "http://192.168.1.223:4444/wd/hub"
    chrome_options = Options()
    chrome_options.page_load_strategy = 'normal'
    # 设置所需的浏览器和选项(这里是Chrome)
    chrome_options.add_argument('--platform=WINDOWS')  # 根据需要更改平台
    desired_capabilities = DesiredCapabilities.CHROME.copy()
    desired_capabilities['platform'] = 'WINDOWS'  # 根据需要更改平台
    # 创建远程WebDriver实例
    driver = webdriver.Remote(command_executor=remote_server_url, desired_capabilities=desired_capabilities)
    # 隐式等待,每一个元素获取,如果没有立刻获取到,则等待最多2秒
    driver.implicitly_wait(2)

    # 2.执行操作

    # 3.关闭实例
    driver.quit()

3.文件下载

目前本人的各个文件版本如下:
	python安装selenium2,pip install selenium==2.48.0
	谷歌浏览器版本:109.0.5405.0
	谷歌驱动版本:109.0.5414.74
	远程selenium服务器:selenium-server-standalone-2.46.0.jar

4.pip离线安装模块
这部分是追加的内容,当我想要在内网安装python模块时,因为没有外网,所以直接pip install xxx会失败
我们可以先在外网使用pip安装好模块,然后打开pip模块文件存放路径,将模块文件拷贝到内网的pip模块存放路径
通过pip show pip就可以查看到我们的python模块文档存放的路径,下面是一个例子

1.我在外网安装好selenium2.48.0后,通过"pip show pip"命令发现模块存储在d:\python\lib\site-packages

PS C:\WINDOWS\System32> pip show pip
Name: pip
Version: 22.3
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: d:\python\lib\site-packages
Requires:
Required-by:
PS C:\WINDOWS\System32>

2.而后拷贝selenium和selenium-2.48.0-py3.9.egg-info两个目录到内网的模块安装目录中
3.cmd中输入pip list检查是否安装完毕

注意:有时候我们会发现,即使给内网python安装完相应模块后,pycharm的代码依然报错
而且你会发现,在pycharm中输入pip list并没有发现我们安装的模块,而在cmd中却可以发现已经安装了模块
这一现象是因为pycharm项目有自己的模块文件存放位置,我们应该把模块文件拷贝到pycharm项目的目录中
具体位置大概是:项目/venv/Lib/site-packages