3

有人会认为这应该是一件容易的事情,但我找不到一种方法来检测Chromium Edge Selenium webdriver Window 是否在 Powershell 中最小化。

具体来说,一个 Window 的大小和位置似乎是相同的,无论它是处于最大化还是最小化状态。例如,举个例子(从一个正常的非最小化窗口状态开始):

> $driver.manage().Window.size

IsEmpty Width Height
------- ----- ------
  False  1050    708

> $driver.manage().Window.position

IsEmpty  X  Y
-------  -  -
  False 13 18

> $driver.manage().Window.minimize()
> $driver.manage().Window.size

IsEmpty Width Height
------- ----- ------
  False  1050    708

> $driver.manage().Window.position

IsEmpty  X  Y
-------  -  -
  False 13 18

如您所见,即使窗口已最小化,窗口的大小和位置仍保持不变。

我在任何地方都找不到isMinimized()方法或类似的东西。

Chromium Edge webdriver 版本是 93.0.961.38。

有任何想法吗?

4

3 回答 3

1

您可以尝试使用 Selenium 驱动程序执行 JavaScript 以获取视口的大小(没有 powershell,但在我们的场景中有效)。

const width  = window.innerWidth || document.documentElement.clientWidth || 
document.body.clientWidth;
const height = window.innerHeight|| document.documentElement.clientHeight|| 
document.body.clientHeight;

参考:
获取屏幕、当前网页和浏览器窗口的大小

用powershell访问WindowVisualState的进程:

Add-Type -AssemblyName UIAutomationClient
$prList = Get-Process -Name "notepad"
$prList | % {
    $ae = [System.Windows.Automation.AutomationElement]::FromHandle($_.MainWindowHandle)
    $wp = $ae.GetCurrentPattern([System.Windows.Automation.WindowPatternIdentifiers]::Pattern)
    echo "Window visual state: $($wp.Current.WindowVisualState)"
}

结果:

Window visual state: Minimized

参考:
获取另一个进程的窗口状态

于 2021-09-13T20:54:42.780 回答
1

我的解决方案是强制启动 selenium edgedriver 实例最大化。因此,对边缘驱动程序实例化前后的进程列表进行比较和过滤以查找“msedge”进程,然后首先将其最小化,然后再最大化。

$workingPath = 'C:\selenium'

if (($env:Path -split ';') -notcontains $workingPath) {
    $env:Path += ";$workingPath"
}

[System.Reflection.Assembly]::LoadFrom("$($workingPath)\WebDriver.dll")

# get all listening processes before new edgedriver is started
$processesBefore = $(netstat -aon | findstr LISTENING)

# launch edgedriver
$EdgeDriver = New-Object OpenQA.Selenium.Edge.EdgeDriver

# get all listening processes after edgedriver started
$processesAfter = $(netstat -aon | findstr LISTENING)

# get the differencing processes (find the new processes)
$processesDiff = Compare-Object -ReferenceObject $processesBefore -DifferenceObject $processesAfter

# get the process ids of new processes
$processIdArray = foreach($process in $processesDiff) {
    $process.InputObject.Split(' ')[-1]
}

# get the msedge process
$p = Get-Process -id $processIdArray | where name -eq msedge

# source of howto maximize a window: https://community.spiceworks.com/topic/664020-maximize-an-open-window-with-powershell-win7
Add-Type '[DllImport("user32.dll")] public static extern bool ShowWindowAsync (IntPtr hwnd, int nCmdShow);' -Name Win32ShowWindowAsync -Namespace Win32Functions

# first minimize the window so it can be maximized
$null = [Win32Functions.Win32ShowWindowAsync]::ShowWindowAsync($p.MainWindowHandle, 6)

# lastly maximize the window
$null = [Win32Functions.Win32ShowWindowAsync]::ShowWindowAsync($p.MainWindowHandle, 3)

# navigate to web page and do stuff
$EdgeDriver.Navigate().GoToUrl('https://example.org')
于 2021-09-16T16:09:41.830 回答
-1

最好的方法是强制启动 selenium edgedriver。

这样,它将强制最小化。

于 2021-09-19T12:35:57.423 回答