ubuntu 服务器下 selenium 自动回复程序报错

2020-09-08 16:02:24 +08:00
 MagicalE

小白刚开始学习 python,打算写个贴吧自动回复的程序练练手。

本来在 Windows 下已经调试好了,原代码如下:

from selenium import webdriver
from time import sleep

def cookie():
    cookies='''
    BDUSS=xxxx
    STOKEN=xxxx
    '''
    for lines in cookies.split():
        name = lines.split('=')[0]
        value = lines.split('=')[1]
        browser.add_cookie({"name":name,"value":value})
    browser.refresh()

def reply():
    content = 'test'
    js = "document.getElementById('ueditor_replace').innerHTML='%s'" % content
    browser.execute_script(js)
    browser.find_element_by_css_selector('.poster_submit').click()

def main():
    browser.get('https://tieba.baidu.com/p/xxxxxxxxx')
    sleep(5)
    cookie()
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    sleep(5)
    reply()
    sleep(5)
    browser.close()

browser = webdriver.Chrome()
if __name__ == '__main__':
    main()

放在 Ubuntu 服务器上却有些问题>﹏<

由于服务器没有图形界面,运行时会报错:

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.

查了一下需要设置为无头浏览器模式,于是添加了以下部分:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
browser = webdriver.Chrome(options=chrome_options)

可以正常运行 selenium 后,又报 JS 代码的错误

selenium.common.exceptions.JavascriptException: Message: javascript error: Cannot set property 'innerHTML' of null

说 reply 部分的 JS 代码将 innerHTML 设置为空,但我没有设置为空呀,不懂 JS,真心求教!

1563 次点击
所在节点    Python
10 条回复
nullboy
2020-09-09 10:37:19 +08:00
selenium 用 docker 起啊,用 remote driver
MagicalE
2020-09-09 11:35:10 +08:00
@nullboy 谢谢,我了解一下。
感觉程序报错可能是 headless chrome 的问题,Windows 下面直接调用 chrome 是没问题的。。
teddy2725
2020-09-09 11:49:59 +08:00
需要搞个 virtual diplay
musi
2020-09-09 13:15:51 +08:00
你是英语不好么,说的是不能设置 null 对象的 innerHTML 属性。。。
MagicalE
2020-09-09 13:41:34 +08:00
@teddy2725 好的谢谢,我也了解一下。
MagicalE
2020-09-09 13:53:04 +08:00
@musi 哈哈,上大学以后英语用太少了(不过最近也开始背托福单词了)
第一眼看到这个报错我也翻译的是 null 的 innerHTML,但不了解 js 觉得 null 是形容词感觉怪怪的,碰巧划词软件翻译的是"无法将属性“ innerHTML”设置为 null",就顺着这个意思了。
那么照原本的意思来看是因为 headless 模式下的 chrome 不能设置 null 的属性嘛? Windows 下的 chrome 明明可以的>︿<
MagicalE
2020-09-09 15:24:14 +08:00
@teddy2725 pyvirtualdisplay 是为了不使用 headless 模式还是为了防止被检测呢?开启 virtual display 后,如果不使用 headless 模式还是会报错'Chrome failed to start';使用 headless 也还是报错识别不到 element (可能还是被检测到了╯︿╰)
musi
2020-09-09 16:08:59 +08:00
@MagicalE 有头模式你也不能设置 null 的属性啊,这应该是你元素没有定位到的问题
MagicalE
2020-09-09 18:10:09 +08:00
@musi 嗯嗯,我发现无头 chrome 什么页面的元素都定位不了,还不知道怎么解决,实在不行就用 Firefox 吧。。
teddy2725
2020-09-10 11:00:23 +08:00
@MagicalE 是为了不使用 headless 模式 然后可以截图看网页渲染状态好 debug, 有些网页 headless 会打不开

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/705230

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX