使用Python将selenium chrome实例发送到后台

Sta*_*tan 5 python-3.x phantomjs selenium-webdriver pyvirtualdisplay google-chrome-headless

我正在尝试使用 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)
Run Code Online (Sandbox Code Playgroud)

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

限制:请注意以下限制:

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

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

Deb*_*anB 4

没有编程方式可以在后台或作为后台进程在浏览器客户端中打开。

\n\n

当然,另一种方法是使用无头浏览器,您可以在哪些驱动程序支持 \xe2\x80\x9cno-browser\xe2\x80\x9d/\xe2\x80\x9cheadless\xe2\x80\x9d 测试中找到详细讨论?

\n\n

为什么不可能呢?

\n\n

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

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

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

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

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

    • \n
  • \n
  • 此外,

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

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

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

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

    • \n
    • 其次,我们不希望浏览器窗口的焦点自动化。这意味着仅仅将浏览器窗口强制到前台并不是最理想的。

    • \n
  • \n
\n\n

结论

\n\n

始终保持测试环境与开发环境分开,并且绝对不受人工干预

\n