4

我正在尝试使用 Python 和 selenium 打开一个简单的 chrome 实例。请在下面找到我的代码:

import time, datetime, sys, os
start_time = time.time()
from datetime import datetime
os.system("cls")
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

CHROME_PATH = 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
CHROMEDRIVER_PATH = 'C:\\Users\\'+userID+'\\'+filename+'\\chromedriver.exe'
WINDOW_SIZE = "1920,1080"

chrome_options = Options()  
chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
chrome_options.add_argument("disable-gpu")
chrome_options.add_argument("disable-infobars")
chrome_options.add_argument("--disable-notifications")
chrome_options.binary_location = CHROME_PATH

browser = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,chrome_options=chrome_options)
time.sleep(1)
browser.get("https://www.google.com")
os.system("cls")
time.sleep(2)

我希望它在后台打开,即当我输入其他内容时,鼠标/光标焦点不应在打开后随机转到此自动 chrome 实例。

限制:请注意以下限制:

  1. 我不能使用“--headless”
  2. 我不能使用 phantomJS
  3. 我不能使用 PyVirtualDisplay,因为代码(exe 文件)最终将部署在 Windows 机器上供最终用户使用。

还有其他方法可以将此 chrome 实例推到后台吗?谢谢

4

2 回答 2

4

没有编程方式可以在后台或作为后台进程在Browser Client中打开。

粗略的替代方法是使用无头浏览器,您可以在哪些驱动程序支持“无浏览器”/“无头”测试中找到详细讨论?.

为什么不可能?

软件测试自动化是一门艺术。您的测试框架应该是:

  • 配置了所有必需的软件二进制文件
  • 测试执行必须在受控环境中执行以优化性能。
  • 在您@Tests执行时,它应该不受Manual Intervention的影响。
  • 特别是当您基于Selenium时,而测试执行@Tests正在进行中,则不应干预测试环境,原因如下

    • 在最低级别,actions 类的行为旨在尽可能接近地模拟远程端与实际输入设备的行为,并且实施策略可能涉及例如将合成事件注入浏览器事件循环。因此,发送动作的步骤将不可避免地在特定于实现的领域中结束。但是,某些内容可观察到的效果必须在实现之间保持一致。为了适应这一点,规范要求远程端执行特定于实现的动作分派步骤,以及事件列表及其属性。这个列表并不全面;特别是输入源的默认操作可能会导致根据浏览器的实现和状态生成其他事件(例如,当焦点位于可编辑元素上时,与关键操作相关的输入事件,
  • 而且,

    • WebDriver API 用户生成的激活触发器需要与真实用户与浏览器交互生成的触发器没有区别。特别是,调度的事件将 isTrusted 属性设置为 true。调度这些事件的最可靠方法是在浏览器实现本身中创建它们。将特定于操作系统的输入消息发送到浏览器窗口的缺点是,正在自动化的浏览器可能无法与用户意外修改输入源状态正确隔离。使用操作系统级别的可访问性 API 的缺点是浏览器的窗口必须聚焦,因此,多个 WebDriver 实例不能并行运行。

    • 操作系统级别的可访问性 API 的一个优点是它保证输入正确反映用户输入,并在必要时允许与主机操作系统交互。但是,从机器利用率的角度来看,这可能会带来性能损失。

  • 此外,

    • 机器人类用于生成本地系统输入事件,用于测试自动化、自运行演示和其他需要控制鼠标和键盘的应用程序。Robot 的主要目的是促进 Java 平台实现的自动化测试。使用类生成输入事件与将事件发布到 AWT 事件队列或 AWT 组件的不同之处在于,事件是在平台的本机输入队列中生成的。例如,Robot.mouseMove 实际上会移动鼠标光标,而不仅仅是生成鼠标移动事件。
  • 最后,根据Internet Explorer 和 Native Events

    • 由于 InternetExplorerDriver 仅适用于 Windows,因此它尝试使用所谓的“本机”或操作系统级别的事件在浏览器中执行鼠标和键盘操作。这与使用模拟的 JavaScript 事件进行相同的操作形成对比。使用本机事件的优点是它不依赖于 JavaScript 沙箱,并且可以确保在浏览器中正确地传播 JavaScript 事件。但是,当 IE 浏览器窗口没有焦点以及尝试将鼠标悬停在元素上时,当前存在一些鼠标事件问题。
  • 浏览器焦点:

    • 挑战在于,如果窗口没有焦点,IE 本身似乎不完全尊重我们发送给 IE 浏览器窗口(WM_MOUSEDOWN 和 WM_MOUSEUP)的 Windows 消息。具体来说,被点击的元素会收到一个围绕它的焦点窗口,但点击不会被该元素处理。可以说,我们根本不应该发送消息。相反,我们应该使用 SendInput() API,但该 API 明确要求窗口具有焦点。我们与 WebDriver 项目有两个相互冲突的目标。

    • 首先,我们努力尽可能地模仿用户。这意味着使用原生事件而不是使用 JavaScript 模拟事件。

    • 其次,我们不希望自动聚焦浏览器窗口。这意味着仅将浏览器窗口强制置于前台是次优的。

结论

始终保持测试环境与开发环境分开,并且完全不受手动干预

于 2018-10-10T13:57:50.650 回答
0

在 Windows 上,您可以使用“任务调度程序”,如果您设置在登录时打开或在盯着系统时打开,它将在后台打开。在硒中我只发现:

browser.set_window_position(-10000, 0)
browser.set_window_size(0, 0) # this is optional

但浏览器将在任务栏上可见(您无法打开它)。 在此处输入图像描述

于 2021-04-14T12:37:39.180 回答