Golang Docker Sélénium Chrome
Golang Docker Selenium Chrome是一种强大的组合,为开发人员提供了便捷且高效的工具链。Golang是一种高性能的编程语言,具有简洁的语法和强大的并发性能。Docker是一种容器化技术,可以将应用程序与其依赖项打包成一个独立的运行环境。Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作。而Chrome是一款流行的Web浏览器。通过结合使用这些工具,开发人员可以更方便地进行Web应用程序的开发和测试。在本文中,我们将深入探讨如何使用Golang Docker Selenium Chrome来加速开发过程,并分享一些实用技巧和最佳实践。
问题内容
我在 golang 中有一个 api,它尝试连接到在 docker 镜像中运行的 selenium 服务器:
package main import ( "fmt" "time" "github.com/tebeka/selenium" "github.com/tebeka/selenium/chrome" ) func main() { // configuração webdriver (simulador) caps := selenium.capabilities{ "browsername": "chrome", "browserversion": "114.0", "se:novncport": 7900, "se:vncenabled": true, } chromecaps := chrome.capabilities{ args: []string{ "--headless", }, } caps.addchrome(chromecaps) // iniciando o servidor, conectado ao eu webdriver que esta rodando wd, err := selenium.newremote(caps, "http://localhost:4444/wd/hub") if err != nil { fmt.printf("falha ao iniciar o servidor selenium: %s\n", err.error()) return } defer wd.quit() time.sleep(10 * time.second) // inicia a pagina inicial kk err = wd.get("https://www.csonline.com.br/") if err != nil { fmt.printf("falha ao abrir a página de login: %s\n", err.error()) return } time.sleep(10 * time.second) // selecionar o elemento por id usernamefield, err := wd.findelement(selenium.byid, "dfgd") if err != nil { fmt.printf("falha ao encontrar o campo de usuário: %s\n", err) return } //populando os campos, ai é só repetir os passos err = usernamefield.sendkeys("dfglkdf) if err != nil { fmt.printf("falha ao preencher o campo de usuário: %s\n", err.error()) } passwordfield, err := wd.findelement(selenium.byid, "dfg") if err != nil { fmt.printf("falha ao encontrar o campo de senha: %s\n", err.error()) } err = passwordfield.sendkeys("dlfknvkxjcn ") if err != nil { fmt.printf("falha ao preencher o campo de senha: %s\n", err.error()) } // envia o formulário de login loginbutton, err := wd.findelement(selenium.bycssselector, "#next") if err != nil { fmt.printf("falha ao encontrar o botão de login: %s\n", err.error()) } err = loginbutton.click() if err != nil { fmt.printf("falha ao clicar no botão de login: %s\n", err.error()) } fmt.println("sucess") //aguarda um tempo para realizar login time.sleep(10 * time.second) access, err := wd.findelement(selenium.byid, "btnselectlogin") if err != nil { fmt.printf("falha ao encontrar o botão de acesso: %s\n", err) } err = access.click() if err != nil { fmt.printf("falha ao clicar no botão de acesso: %s\n", err) } fmt.println("sucess") localstoragescript := `return localstorage.getitem("cs.token");` // execute o script no contexto do navegador localstoragedata, err := wd.executescript(localstoragescript, nil) if err != nil { fmt.println("falha ao obter dados do localstorage:", err) } // imprima os dados do localstorage fmt.println("bearer", localstoragedata) }
我在docker中安装了selenium,如下所示:
docker pull selenium/standalone-chrome
我运行此命令在 docker 中启动 selenium:
docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome
运行命令时 go run main.go 我在 go 终端中收到此错误:
invalid session id: unable to execute request for an existing session: unable to find session with id: build info: version: '4.10.0', revision: 'c14d967899' system info: os.name: 'linux', os.arch: 'amd64', os.version: '5.10.16.3-microsoft-standard-wsl2', java.version: '11.0.19' driver info: driver.version: unknown
在 docker 中的 selenium 日志中我得到:
WARN [SeleniumSpanExporter$1.lambda$export$3] - {"traceId": "171e16c9402c8f85639418c7b458f388","eventTime": 1687963769139610379,"eventName": "exception","attributes": {"exception.message": "Unable to execute request for an existing session: Unable to find session with ID: \nBuild info: version: '4.10.0', revision: 'c14d967899'\nSystem info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.16.3-microsoft-standard-WSL2', java.version: '11.0.19'\nDriver info: driver.version: unknown","exception.stacktrace": "org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: \nBuild info: version: '4.10.0', revision: 'c14d967899'\nSystem info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.16.3-microsoft-standard-WSL2', java.version: '11.0.19'\nDriver info: driver.version: unknown\n\tat org.openqa.selenium.grid.sessionmap.local.LocalSessionMap.get(LocalSessionMap.java:137)\n\tat org.openqa.selenium.grid.router.HandleSession.lambda$loadSessionId$4(HandleSession.java:172)\n\tat io.opentelemetry.context.Context.lambda$wrap$2(Context.java:224)\n\tat org.openqa.selenium.grid.router.HandleSession.execute(HandleSession.java:125)\n\tat org.openqa.selenium.remote.http.Route$PredicatedRoute.handle(Route.java:384)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:347)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.grid.router.Router.execute(Router.java:87)\n\tat org.openqa.selenium.grid.web.EnsureSpecCompliantResponseHeaders.lambda$apply$0(EnsureSpecCompliantResponseHeaders.java:34)\n\tat org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:347)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.http.Route$NestedRoute.handle(Route.java:271)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:347)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:347)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:347)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:347)\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:69)\n\tat org.openqa.selenium.remote.AddWebDriverSpecHeaders.lambda$apply$0(AddWebDriverSpecHeaders.java:35)\n\tat org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)\n\tat org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)\n\tat org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)\n\tat org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)\n\tat org.openqa.selenium.netty.server.SeleniumHandler.lambda$channelRead0$0(SeleniumHandler.java:44)\n\tat java.base\u002fjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n\tat java.base\u002fjava.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base\u002fjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat java.base\u002fjava.lang.Thread.run(Thread.java:829)\n","exception.type": "org.openqa.selenium.NoSuchSessionException","http.flavor": 1,"http.handler_class": "org.openqa.selenium.grid.router.HandleSession","http.host": "localhost:4444","http.method": "POST","http.request_content_length": "38","http.scheme": "HTTP","http.target": "\u002fsession\u002f\u002furl","http.user_agent": "Go-http-client\u002f1.1","session.id": ""}}
为什么会发生这种情况?有人可以提供帮助吗?
解决方法
要使您的演示与 selenium/standalone-chrome:latest
(目前为 selenium/standalone-chrome:4.10.0
)一起使用,您需要将 w3c
设置为 true
:
chromeCaps := chrome.Capabilities{ Args: []string{ "--headless", }, W3C: true, }
如果你仔细查看容器的日志,你应该会看到类似这样的内容:
警告 [seleniumspanexporter$1.lambda$export$1] - org.openqa.selenium.sessionnotcreatedexception:无法启动新会话。与驱动程序服务创建会话时出错。停止驱动程序服务:无法启动新会话。握手响应与任何支持的协议不匹配。响应负载:{"sessionid":"4ef27eb4d2fbb1ebfe5cf2fb51df731b","status":33,"value":{"message":"会话未创建:缺少或无效的功能\n(驱动程序信息:chromedriver =114.0.5735.90 (386bc09e8f4f2e025eddae123f36f6263096ae49-refs/branch-heads/5735@{#1052}),platform=linux 5.19.0-43-通用 x86_64)"}}
这可能是由删除 json wire 协议支持引入的重大更改引起的,在 selenium 4.9.0
中提供。
我从演示中删除了 "browserversion": "114.0"
,然后针对 selenium/standalone-chrome:4.8.3
和 selenium/standalone-chrome:4.9.0
进行了测试。结果是,它适用于 4.8.3
,但不适用于 4.9.0
。这至少证明 4.9.0
引入了重大更改。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Extension Python et WebDriver : simulation des opérations de la molette de la souris dans les pages Web Introduction : avec le développement continu de la conception d'interactions Web, la simulation des opérations des utilisateurs est devenue de plus en plus importante dans les tests automatisés. Sur certaines pages Web, l'utilisation de la molette de la souris est devenue l'une des opérations courantes. Cependant, pour les développeurs qui utilisent Python pour écrire des scripts de test automatisés, la simulation des opérations avec la molette de la souris dans WebDriver peut devenir un défi. Cet article présentera une méthode utilisant Python et WebDriv

Utilisez Python et WebDriver pour capturer des pages Web et les enregistrer sous forme de fichiers PDF Résumé : Lors du développement et des tests Web, il est souvent nécessaire de capturer des pages Web à des fins d'analyse, d'enregistrement et de création de rapports. Cet article explique comment utiliser Python et WebDriver pour prendre des captures d'écran de pages Web et enregistrer les captures d'écran sous forme de fichiers PDF pour un partage et un archivage faciles. 1. Installez et configurez SeleniumWebDriver : Installez Python : Visitez le site officiel de Python (https :

Utilisez Python et WebDriver pour remplir automatiquement les codes de vérification sur les pages Web Avec le développement d'Internet, de plus en plus de sites Web ont introduit des mécanismes de code de vérification dans l'enregistrement des utilisateurs, la connexion et d'autres opérations pour améliorer la sécurité et prévenir les attaques automatisées. Cependant, la saisie manuelle du code de vérification est non seulement gênante, mais augmente également la complexité de l'expérience utilisateur. Alors, existe-t-il un moyen de remplir automatiquement le code de vérification ? La réponse est oui. Cet article explique comment utiliser Python et WebDriver pour remplir automatiquement les codes de vérification sur les pages Web. Tout d'abord, je

Utiliser Python et WebDriver pour implémenter l'actualisation automatique des pages Web Introduction : Dans la navigation Web quotidienne, nous rencontrons souvent des scénarios qui nécessitent des actualisations fréquentes des pages Web, comme la surveillance des données en temps réel, l'actualisation automatique des pages dynamiques, etc. L'actualisation manuelle de la page Web fera perdre beaucoup de temps et d'énergie, nous pouvons donc utiliser Python et WebDriver pour implémenter la fonction d'actualisation automatique de la page Web et améliorer notre efficacité de travail. 1. Environnement d'installation et de configuration Avant de commencer, nous devons installer et configurer l'environnement correspondant. Installer Python

L'utilisation de Python et WebDriver pour remplir automatiquement les données des formulaires sur les pages Web constitue une partie importante du processus de développement logiciel. L'un d'eux est le remplissage automatique des formulaires Web. Pour les développeurs, remplir manuellement des formulaires est un processus fastidieux et sujet aux erreurs. L'utilisation de Python et WebDriver pour remplir automatiquement les données des tableaux pendant le processus de test automatique peut réduire la duplication manuelle du travail et améliorer l'efficacité des tests. Dans cet article, je vais vous présenter comment utiliser Selenium avec Python

Extensions Python et WebDriver : simuler les clics droits de la souris sur les pages Web Lorsque nous utilisons Python et WebDriver pour des tests automatisés de pages Web, nous devons souvent simuler les comportements de la souris de l'utilisateur, tels que les clics, les glissements et les opérations de menu contextuel. WebDriver fournira certaines fonctions d'action de base de la souris, telles que cliquer, glisser-déposer, etc., mais il ne fournit pas directement de fonction qui simule un clic droit de la souris. Cet article expliquera comment utiliser Python et WebD

Utiliser Python et WebDriver pour implémenter la fonction de remplissage automatique de formulaires Lors de la navigation quotidienne sur des sites Web, nous rencontrons souvent des situations où nous devons remplir des formulaires. Lorsque nous devons remplir fréquemment des formulaires identiques ou similaires, le remplissage manuel devient fastidieux et prend du temps. Heureusement, nous pouvons utiliser Python et WebDriver pour réaliser la fonction de remplissage automatique des formulaires et améliorer notre efficacité de travail. Tout d’abord, nous devons installer la bibliothèque Selenium. Selenium est un outil de test automatisé qui peut simuler

Utilisez les extensions Python et WebDriver pour automatiser l'opération de glisser-déposer des pages Web. Dans les applications Web réelles, le glisser-déposer (glisser-déposer) est une opération interactive courante qui peut améliorer l'expérience utilisateur et la commodité. L'automatisation des opérations de glisser-déposer pour les pages Web est une tâche importante et courante pour les testeurs. Cet article explique comment utiliser les extensions Python et WebDriver pour automatiser les opérations de glisser-déposer sur les pages Web. 1. Préparation Avant de commencer, nous devons installer Pyt
