我正在尝试启动一个Chrome进程(在应用程序模式下),然后等待用户关闭它。
问题:Chrome进程不会阻塞。好像在启动进程时,Chrome会生成另一个进程并从原始进程返回。为了我的软件包能够正常工作,我需要能够确定Chrome应用程序窗口何时关闭。
我知道可以使用selenium来解决这个问题,但我非常希望让我的软件包尽可能轻量化。
据我所知,没有任何标志可以传递给Chrome可执行文件以强制其阻塞。
我的代码如下,将成功启动Chrome窗口,但随即立即返回。打印的调试信息显示该进程立即完成。
通过命令终端启动Chrome可执行文件会产生相同的结果;窗口会按预期打开和操作,但命令的执行不会被阻塞:
问题:Chrome进程不会阻塞。好像在启动进程时,Chrome会生成另一个进程并从原始进程返回。为了我的软件包能够正常工作,我需要能够确定Chrome应用程序窗口何时关闭。
我知道可以使用selenium来解决这个问题,但我非常希望让我的软件包尽可能轻量化。
据我所知,没有任何标志可以传递给Chrome可执行文件以强制其阻塞。
我的代码如下,将成功启动Chrome窗口,但随即立即返回。打印的调试信息显示该进程立即完成。
package main
import (
"fmt"
"os/exec"
"runtime"
)
func openChrome(url string, appMode bool) error {
var urlArgs []string
if appMode {
urlArgs = []string{"--app=" + url}
} else {
urlArgs = []string{"--chrome-frame", url}
}
switch runtime.GOOS {
case "windows":
var chrome string
if runtime.GOARCH == "386" {
chrome = "C:/Program Files/Google/Chrome/Application/chrome.exe"
} else {
chrome = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
}
cmd := exec.Command(chrome, urlArgs...)
err := cmd.Run()
fmt.Println(cmd.ProcessState.Pid())
fmt.Println(cmd.ProcessState.Exited())
fmt.Println(cmd.ProcessState.Success())
fmt.Println(cmd.Process.Pid)
if err != nil {
return err
}
case "darwin":
urlArgs = append([]string{"-b", "com.google.Chrome", "--args"}, urlArgs...)
var cmd *exec.Cmd
if runtime.GOARCH == "386" {
cmd = exec.Command("open", urlArgs...)
} else {
cmd = exec.Command("open", urlArgs...)
}
err := cmd.Start()
if err != nil {
return err
}
default:
cmd := exec.Command("google-chrome", urlArgs...)
err := cmd.Start()
if err != nil {
return err
}
}
return nil
}
func main() {
openChrome("https://stackoverflow.com/", true)
}
通过命令终端启动Chrome可执行文件会产生相同的结果;窗口会按预期打开和操作,但命令的执行不会被阻塞:
C:\WINDOWS\system32>"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
C:\WINDOWS\system32>
那么如何启动Chrome进程并检测实际生成的进程何时终止?