使用 Selenium 的 WhatsApp Web 自动化无法正常工作

WhatsApp Web automation with Selenium not working

我发现 this python script on github 通过 Selenium 自动发送 WhatsApp Web 消息。

#https://www.github.com/iamnosa
#Let's import the Selenium package
from selenium import webdriver

#Let's use Firefox as our browser
web = webdriver.Firefox()
web.get('http://web.whatsapp.com')
input()

#Replace Mr Kelvin with the name of your friend to spam
elem = web.find_element_by_xpath('//span[contains(text(),"Mr Kelvin")]')
elem.click()
elem1 = web.find_elements_by_class_name('input')
while True:
    elem1[1].send_keys('hahahahahahaha')
web.find_element_by_class_name('send-container').click()

虽然它是用来发送垃圾邮件的,但我试图将它改编成一个好的目的,但目前的脚本似乎不起作用。它不是通过 WhatsApp Web 发送消息,而是简单地加载一个 QR 身份验证屏幕,然后在我用我的手机进行身份验证后它什么都不做。

关于为什么会发生这种情况的任何线索?我是 运行 Firefox 上最新版本的 Selenium WebDriver,并且 geckodriver 已经被提取到 /usr/bin/。

这一行:

input()

正在等待按键继续。 扫描后按任意键即可。

我知道这个 post 比较旧,但它似乎仍然经常被查看。 @vhad01 的击键解释有道理,但对我不起作用。

一个对我有用的简单变通方法: 将 input() 替换为

import time
time.sleep(25)

而 25 是等待代码进一步执行的秒数。 (15个应该也够扫描二维码了,...)

我正在编写一个 selenium 脚本来安排我的消息,我遇到了你的问题。是的,问题是 input() 行。 而不是使用 input():

使用 time.sleep(),毫无疑问它会起作用,但更好的方法是使用 implicit_wait(15)

Time.sleep() 让你在扫描后等待。脚本在给定的秒数之前完全停止。

在 implicit_wait() 中,如果元素在指定时间之前出现,则脚本将开始执行,否则脚本将抛出 NoSuchElementException。

我使用了与 whatsapp_login() 和 QR 扫描更不同的方法。查看我的回购 link: https://github.com/shauryauppal/PyWhatsapp

你也喜欢这种方法。

更好的方法是在命令行中扫描 QR 码点击 return 并进一步处理您的代码。

browser = webdriver.Firefox()
browser.get('https://web.whatsapp.com/')
print('Please Scan the QR Code and press enter')
input()

这就是您所需要的,而且适用于此问题的逻辑也不是很模糊。

我实现扫描二维码的方法是检测页面上是否存在搜索栏。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


chatlist_search = ".jN-F5.copyable-text.selectable-text"

web.get("https://web.whatsapp.com")
WebDriverWait(web, 60).until(EC.visibility_of_element_located((By.CSS_SELECTOR, chatlist_search)))

这将等到聊天搜索栏呈现在页面上,否则将在 60 秒后超时。