Docker:使用带无头Selenium Chromedriver的容器

时间:2015-04-21 19:20:44

标签: python selenium docker selenium-chromedriver docker-compose

我尝试使用使用Selenium的抓取代码将peroumal1's "docker-chrome-selenium" container链接到另一个容器。

他将容器暴露在4444端口(Selenium的默认容器),但是我从刮刀容器中访问它时遇到了麻烦。这是我的docker-compose文件:

chromedriver:
  image: eperoumalnaik/docker-chrome-selenium:latest

scraper:
  build: .
  command: python manage.py scrapy crawl general_course_content
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - chromedriver

这是我的刮刀Dockerfile:

FROM python:2.7

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code/

但是,当我尝试从我的代码中使用Selenium时(见下文),我收到以下错误消息:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be available in the path. Please look at http://docs.seleniumhq.org/download/#thirdPartyDrivers and read up at http://code.google.com/p/selenium/wiki/ChromeDriver。在Mac OS X上,当我没有使用Docker时,我通过下载chromedriver binary并将其添加到路径来修复此问题,但我不知道该怎么做。

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://google.com')
driver.close()

修改:我还尝试使用Selenium's official images执行此操作,但不幸的是,它也无法正常工作(同样的错误消息要求chromedriver二进制文件显示)。

是否需要对Python代码进行某些操作?

谢谢!

更新:正如@ peroumal1所说,问题是我没有连接到remote driver using Selenium。但是,在我这样做之后,我遇到连接问题(urllib2.URLError: <urlopen error [Errno 111] Connection refused>),直到我修改了Selenium驱动程序连接到的IP地址(使用boot2docker时,您必须连接到虚拟机&#39; s IP而不是您的计算机的localhost,您可以通过键入boot2docker ip)找到并更改docker-compose文件。这就是我最终的结果:

chromedriver:
  image: selenium/standalone-chrome
  ports:
    - "4444:4444"

scraper:
  build: .
  command: python manage.py scrapy crawl general_course_content
  volumes:
    - .:/code
  ports:
    - 8000:8000
  links:
    - chromedriver

我的计算机上的Python代码(boot2docker的IP地址为192.168.59.103):

driver = webdriver.Remote(
           command_executor='http://192.168.59.103:4444/wd/hub',
           desired_capabilities=DesiredCapabilities.CHROME)
driver.maximize_window()
driver.get('http://google.com')
driver.close()

0 个答案:

没有答案