Golang Docker Selenium 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
引入了重大更改。
The above is the detailed content of Golang Docker Selenium Chrome. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Python and WebDriver extension: Simulating mouse wheel operations in web pages Introduction: With the continuous development of web interaction design, simulating user operations has become more and more important in automated testing. On some web pages, the use of the mouse wheel has become one of the common operations. However, for developers who use Python to write automated test scripts, how to simulate mouse wheel operations in WebDriver can become a challenge. This article will introduce a method using Python and WebDriv

Use Python and WebDriver to screenshot web pages and save them as PDF files Summary: During web development and testing, it is often necessary to screenshot web pages for analysis, recording, and reporting. This article will introduce how to use Python and WebDriver to take screenshots of web pages and save the screenshots as PDF files for easy sharing and archiving. 1. Install and configure SeleniumWebDriver: Install Python: Visit the Python official website (https:

Use Python and WebDriver to automatically fill in verification codes on web pages. With the development of the Internet, more and more websites have introduced verification code mechanisms in user registration, login and other operations to improve security and prevent automated attacks. However, manually entering the verification code is not only troublesome, but also increases the complexity of the user experience. So, is there a way to automatically fill in the verification code? The answer is yes. This article will introduce how to use Python and WebDriver to automatically fill in verification codes on web pages. firstly, I

Using Python and WebDriver to implement automatic web page refresh Introduction: In daily web browsing, we often encounter scenarios that require frequent web page refreshes, such as monitoring real-time data, automatically refreshing dynamic pages, etc. Manually refreshing the web page will waste a lot of time and energy, so we can use Python and WebDriver to implement the function of automatically refreshing the web page and improve our work efficiency. 1. Installation and configuration environment Before starting, we need to install and configure the corresponding environment. Install Python

Using Python and WebDriver to automatically fill in form data on web pages is an important part of the software development process. One of them is the automatic filling of web forms. For developers, filling out forms manually is a tedious and error-prone process. Using Python and WebDriver to automatically fill in table data during the automatic testing process can reduce manual duplication of work and improve testing efficiency. In this article, I will introduce how to use Selenium with Python

Python and WebDriver extensions: Simulate right-click mouse clicks on web pages When using Python and WebDriver for automated web page testing, we often need to simulate user mouse behaviors, such as clicks, drags, and right-click menu operations. WebDriver will provide some basic mouse action functions, such as click, drag_and_drop, etc., but it does not directly provide a function to simulate a right mouse click. This article will introduce how to use Python and WebD

Use Python and WebDriver extensions to automate the drag-and-drop operation of web pages. In actual web applications, drag-and-drop (Drag and Drop) is a common interactive operation, which can enhance user experience and convenience. Automating drag-and-drop operations for web pages is an important and common task for testers. This article will introduce how to use Python and WebDriver extensions to automate drag-and-drop operations on web pages. 1. Preparation Before starting, we need to install Pyt

Using Python and WebDriver to implement form automatic filling function In daily website browsing, we often encounter situations where we need to fill in forms. When we need to fill out the same or similar forms frequently, manual filling becomes tedious and time-consuming. Fortunately, we can use Python and WebDriver to realize the function of automatically filling in forms and improve our work efficiency. First, we need to install the selenium library. Selenium is an automated testing tool that can simulate
