小白刚开始学习 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,真心求教!
昨天怕是JS代码的问题,我将reply部分改为使用add_key添加回复内容了,windows下依旧正常使用
browser.find_element_by_id('ueditor_replace').click
input_box = browser.find_element_by_id('ueditor_replace')
input_box.send_keys('TEST')
sleep(5)
browser.find_element_by_css_selector('.poster_submit').click()
但linux下还是报错:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="ueditor_replace"]"}
稍微学了下headless chrome的调试,发现使用headless模式的时候访问需要验证,可能是被百度检测到了,所以linux下的程序无法正常访问贴吧,导致识别不出元素。
希望大佬们能指点一下(/ω\)
1
nullboy 2020-09-09 10:37:19 +08:00 via Android 1
selenium 用 docker 起啊,用 remote driver
|
2
MagicalE OP @nullboy 谢谢,我了解一下。
感觉程序报错可能是 headless chrome 的问题,Windows 下面直接调用 chrome 是没问题的。。 |
3
teddy2725 2020-09-09 11:49:59 +08:00 1
需要搞个 virtual diplay
|
4
musi 2020-09-09 13:15:51 +08:00 via iPhone 1
你是英语不好么,说的是不能设置 null 对象的 innerHTML 属性。。。
|
6
MagicalE OP @musi 哈哈,上大学以后英语用太少了(不过最近也开始背托福单词了)
第一眼看到这个报错我也翻译的是 null 的 innerHTML,但不了解 js 觉得 null 是形容词感觉怪怪的,碰巧划词软件翻译的是"无法将属性“ innerHTML”设置为 null",就顺着这个意思了。 那么照原本的意思来看是因为 headless 模式下的 chrome 不能设置 null 的属性嘛? Windows 下的 chrome 明明可以的>︿< |
7
MagicalE OP @teddy2725 pyvirtualdisplay 是为了不使用 headless 模式还是为了防止被检测呢?开启 virtual display 后,如果不使用 headless 模式还是会报错'Chrome failed to start';使用 headless 也还是报错识别不到 element (可能还是被检测到了╯︿╰)
|
9
MagicalE OP @musi 嗯嗯,我发现无头 chrome 什么页面的元素都定位不了,还不知道怎么解决,实在不行就用 Firefox 吧。。
|
10
teddy2725 2020-09-10 11:00:23 +08:00
@MagicalE 是为了不使用 headless 模式 然后可以截图看网页渲染状态好 debug, 有些网页 headless 会打不开
|