我正在尝试使用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实例打开后随机转到它。
限制:请注意以下限制:
- 我不能使用"--headless">
- 我不能使用phantomJS
- 我不能使用PyVirtualDisplay,因为代码(exe文件)最终将部署在windows机器上供最终用户使用
是否有其他方法将此chrome实例推到后台?感谢
在浏览器客户端后台或作为后台进程中,没有程序化打开方式。
粗略地说,另一种方法是使用无头浏览器,您可以在哪些驱动程序支持"无浏览器"/"无头"测试中找到详细的讨论?。
为什么不可能
软件测试自动化是一门艺术。您的测试框架应该是:
- 配置了所有必需的软件、库和二进制文件
- 测试执行必须在受控环境中执行,以优化性能
- 当您的
@Tests
正在执行时,它应该没有手动干预 -
特别是当您的
@Tests
是基于硒的,而测试执行是正在进行时,由于以下原因,不应干预测试环境:- 在最低级别上,
actions
类的行为旨在尽可能接近地模仿具有实际输入设备的远程端的行为,并且实现策略可能涉及例如将合成事件注入浏览器事件循环。因此,采取行动的步骤将不可避免地在具体实施领域结束。然而,某些内容可观察到的效果必须在实现之间保持一致。为了适应这一点,规范要求远程端执行特定于实现的操作调度步骤,以及事件及其属性的列表。这份清单并不全面;特别地,输入源的默认动作可能导致根据浏览器的实现和状态生成附加事件(例如,当焦点在可编辑元素上时与关键动作相关的输入事件、滚动事件等)
- 在最低级别上,
-
此外,
-
WebDriver API用户生成的激活触发需要与真实用户与浏览器交互生成的激活触发器无法区分。特别是,调度的事件将把isTrusted属性设置为true。调度这些事件的最健壮的方法是在浏览器实现本身中创建它们。将操作系统特定的输入消息发送到浏览器的窗口具有的缺点是,被自动化的浏览器可能无法与意外修改输入源状态的用户正确隔离。使用操作系统级可访问性API的缺点是浏览器的窗口必须集中,因此多个WebDriver实例无法并行运行。
-
操作系统级可访问性API的一个优点是,它保证输入正确地反映用户输入,并允许在必要时与主机操作系统进行交互。然而,从机器利用率的角度来看,这可能会对性能造成影响。
-
-
此外,
- 机器人类用于生成本机系统输入事件,用于测试自动化、自运行演示以及其他需要控制鼠标和键盘的应用程序。Robot的主要目的是促进Java平台实现的自动化测试。使用类生成输入事件与将事件发布到AWT事件队列或AWT组件的不同之处在于,事件是在平台的本地输入队列中生成的。例如,Robot.mouseMove实际上会移动鼠标光标,而不仅仅是生成鼠标移动事件
-
最后,根据Internet Explorer和本机事件:
- 由于InternetExplorerDriver仅限Windows,它试图使用所谓的"本机"或操作系统级别的事件在浏览器中执行鼠标和键盘操作。这与将模拟的JavaScript事件用于相同的操作形成对比。使用本机事件的优势在于,它不依赖于JavaScript沙盒,并确保在浏览器中正确传播JavaScript事件。然而,当IE浏览器窗口没有焦点时,以及当试图将鼠标悬停在元素上时,鼠标事件目前存在一些问题
-
浏览器焦点:
-
挑战在于,如果IE浏览器窗口没有焦点,则IE本身似乎没有完全尊重我们发送给IE浏览器窗口的Windows消息(WM_MOUSEDOWN和WM_MOUSEUP)。具体来说,被点击的元素将在其周围接收一个焦点窗口,但该元素不会处理点击。可以说,我们根本不应该发送信息;相反,我们应该使用SendInput()API,但API明确要求窗口具有焦点。我们对WebDriver项目有两个相互矛盾的目标。
-
首先,我们努力尽可能地模仿用户。这意味着使用本机事件,而不是使用JavaScript模拟事件。
-
其次,我们不希望浏览器窗口的焦点被自动化。这意味着仅仅将浏览器窗口强制到前台是次优的。
-
结论
始终保持测试环境与开发环境动干预的影响。
在窗口上,您可以使用;任务调度器";,如果您在登录或启动系统时设置为打开,它将在后台打开。我只在硒中发现:
browser.set_window_position(-10000, 0)
browser.set_window_size(0, 0) # this is optional
但浏览器将在任务栏上可见(您无法打开它)。在此处输入图像描述