|
@@ -19,6 +19,7 @@ import (
|
|
|
const (
|
|
|
BROWSER_DEVICE_TYPE_PC = 0
|
|
|
BROWSER_DEVICE_TYPE_MOBILE = 1
|
|
|
+ BROWSER_RESET_ERROR_LIMIT = 10
|
|
|
)
|
|
|
|
|
|
var (
|
|
@@ -127,6 +128,7 @@ var (
|
|
|
type (
|
|
|
//Browser 浏览器
|
|
|
Browser struct {
|
|
|
+ timeoutAmount int
|
|
|
showImages bool
|
|
|
incognito bool
|
|
|
socks5proxy, proxyChangeIpUrl, clearTraceUrl string
|
|
@@ -346,31 +348,56 @@ func (b *Browser) RunWithTimeout(fn func(ctx context.Context, exit chan<- bool),
|
|
|
go fn(ctx, exit)
|
|
|
select {
|
|
|
case <-exit:
|
|
|
+ b.timeoutAmount = 0
|
|
|
cancelFn()
|
|
|
return
|
|
|
case <-time.After(time.Duration(timeout) * time.Second):
|
|
|
+ fmt.Print("ooo")
|
|
|
+ b.timeoutAmount += 1
|
|
|
cancelFn()
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// CloseTab 过滤,关闭Tab页
|
|
|
-func (b *Browser) CloseTab(filter func(url, title string) bool) {
|
|
|
- defer Catch()
|
|
|
- ts, err := chromedp.Targets(b.incCtx)
|
|
|
+func (b *Browser) CloseTab(ctx context.Context, filter func(title, url string) bool) {
|
|
|
+ if ctx == nil {
|
|
|
+ ctx = b.incCtx
|
|
|
+ }
|
|
|
+ ctx, _ = context.WithTimeout(ctx, 5*time.Second)
|
|
|
+ ts, err := chromedp.Targets(ctx)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
for _, t := range ts {
|
|
|
if filter(t.Title, t.URL) {
|
|
|
- ctx, _ := chromedp.NewContext(b.incCtx, chromedp.WithTargetID(t.TargetID))
|
|
|
- chromedp.Run(ctx,
|
|
|
+ newCtx, _ := chromedp.NewContext(ctx, chromedp.WithTargetID(t.TargetID))
|
|
|
+ chromedp.Run(newCtx,
|
|
|
page.Close(),
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (b *Browser) Revert() *Browser {
|
|
|
+ if b.timeoutAmount > BROWSER_RESET_ERROR_LIMIT {
|
|
|
+ //超时太多了,可能是内部错了,重新创建浏览器实例
|
|
|
+ fmt.Print("[Reset browser]")
|
|
|
+ b.Close()
|
|
|
+ browser := NewBrowser(Headless,
|
|
|
+ SetUserDataDir(UserDataDir),
|
|
|
+ SetSocks5proxy(ProxyAddr),
|
|
|
+ SetProxyChangeIpUrl(ProxyChangeIpUrl),
|
|
|
+ SetDiskCacheDir(DiskCacheDir),
|
|
|
+ SetExtesionDir(ExtesionDir),
|
|
|
+ SetShowImage(ShowImage),
|
|
|
+ //SetIncognito(env.Incognito),
|
|
|
+ )
|
|
|
+ return browser
|
|
|
+ }
|
|
|
+ return b
|
|
|
+}
|
|
|
+
|
|
|
// Close
|
|
|
func (b *Browser) Close() {
|
|
|
defer Catch()
|