【问题标题】:Selenium chrome headless cannot execute onclick event on Linux serverSelenium chrome headless 无法在 Linux 服务器上执行 onclick 事件
【发布时间】:2020-08-30 12:04:23
【问题描述】:

我在将 Python Selenium 无头 google chrome 脚本从 Windows 移植到导航到网站并下载文件的 Linux 服务器时遇到问题。该脚本在 windowslinux 服务器上运行没有错误,但是 linux 服务器上的脚本从不下载一个文件。

我不确定可能是什么问题。我认为这可能是权限问题,但我使用 wget 包运行了一个小脚本,并将文件下载到指定的文件夹中。

您认为是什么阻止了同一个脚本在 linux 服务器上下载文件?服务器安装了最新的 chrome 和 chromedriver(版本 81),我的程序正确指向它们。

此脚本运行并下载图标

import wget
url = "https://www.python.org/static/img/python-logo@2x.png"
wget.download(url, '/external/gen_dir')

此脚本运行并关闭驱动程序,但从不下载任何内容(当指向本地计算机上的正确文件夹时,可在我的个人计算机上的 Windows 中运行)。没有脚本破坏错误 与上述脚本具有相同的下载位置,所以我认为这不是权限问题。两个脚本都是从同一个文件夹中执行的。

from selenium import webdriver
print('packages imported')
from selenium.webdriver.chrome.options import Options
print('options imported')

#specifying headless and download options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu') 

driver = webdriver.Chrome(executable_path=r'team/mm/chromedriver', options=options)


#'/external/gen_dir'  directory for sample data

params = {'behavior': 'allow', 'downloadPath': r'/external/gen_dir'}
driver.execute_cdp_cmd('Page.setDownloadBehavior', params)
print('download paramaters executed')

driver.get("https://www.thinkbroadband.com/download")

# initialize an object to the location on the html page and click on it to download
search_input = driver.find_element_by_css_selector('#main-col > div > div > div:nth-child(8) > p:nth-child(1) > a > img')
search_input.click()

driver.quit()
print('driver closed')

【问题讨论】:

  • 能否请您使用 javascript 执行器来执行对该元素的点击。

标签: python linux selenium google-chrome selenium-chromedriver


【解决方案1】:

似乎是因为 driver.quit() 在下载开始之前运行,所以

search_input.click()
time.sleep(5)

driver.quit()

【讨论】:

  • 嗨菲利普。那行得通。我想问你为什么会认为在我的 Windows 机器上,我不需要放置睡眠计时器,但它必须添加到 Linux 服务器上的脚本中?
  • 您的原始脚本在 Windows 上也不适合我,所以我很难找到。你能仔细检查一下它在 Windows 上对你有用吗?
  • 嗨菲利普,我可以解释为什么它可以在我的电脑上运行。我在 Jupyter 笔记本中编写了它,并且 driver.quit() 行位于单独的单元格中,因此当我运行不同的 Jupyter 单元格时,我无意中延迟了执行。但是是的,如果我将所有代码放在一个单元格中,Windows 中也不会下载任何内容。
  • 这就解释了。例如,对于更大的文件,您仍然需要找到比 time.sleep(5) 更强大的方法。
  • 我知道。我需要写一个延迟操作的检查,直到下载文件夹中的文件号增加一(并且可能检查文件是否已完全下载)。不过感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2018-06-08
  • 2020-04-16
  • 1970-01-01
  • 2020-11-01
  • 2018-07-15
  • 2021-07-27
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多