我想使用 python 和 selenium 向我的一组联系人发送一些文本和图像。我已经有一个用于发送文本的工作代码,但未能找到发送图像的方法。我特别纠结于选择图像。
我的代码是这样的:
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.service import Service
import time
import pyautogui
service = Service(log_path = "log.log")
driver = webdriver.Firefox(service = service)
driver.get("https://web.whatsapp.com")
print("Scan QR Code, And then Enter")
input()
print("Logged In")
contacts = ["John Doe", "Mary Jane"]
text = """This text works"""
file_path = "/home/xyz/Downloads/abcdef.jpeg"
for contact in contacts:
input_box_search = driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div[4]/div/div[1]/div/div/div[2]/div/div[1]")
input_box_search.click()
time.sleep(2)
for i in contact:
input_box_search.send_keys(i)
time.sleep(0.05)
selected_contact = driver.find_element(By.XPATH, "//span[@title='"+contact+"']")
selected_contact.click()
inp_xpath = "/html/body/div[1]/div/div/div[5]/div/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[1]"
input_box = driver.find_element(By.XPATH, inp_xpath)
time.sleep(2)
input_box.click()
for i in text:
input_box.send_keys(i)
time.sleep(0.05)
input_box.send_keys(Keys.ENTER)
time.sleep(2)
add_sign = driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div[5]/div/footer/div[1]/div/span[2]/div/div[1]/div[2]/div/div")
add_sign.click()
time.sleep(1)
photo_icon = driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div[5]/div/footer/div[1]/div/span[2]/div/div[1]/div[2]/div/span/div/ul/div/div[2]/li/div/span")
photo_icon.click()
### This one fails. So does keyboard
pyautogui.typewrite(file_path)
send_icon = driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div[3]/div[2]/span/div/span/div/div/div[2]/div/div[2]/div[2]/div/div")
send_icon.click()
driver.quit()
我可以单击加号,选择菜单中的“照片和视频”项,但文件选择器窗口打开,我无法选择所需的文件。我正在 ubuntu 机器上工作,如果我在弹出窗口后仅按 Ctrl-v 到文件的路径,则粘贴的文本将被视为搜索,文件将被选择,只需附加 ENTER 即可被视为选择文件(关闭窗口并保留代码以单击发送按钮
send_icon
。
我的问题是我找不到如何将文件路径发送到该特定窗口,因此我无法选择要发送的文件。
我愿意采用不同的方法(我已经为此工作了几个小时),只要它不涉及 Whatsapp API(我想使用 selenium 来完成此特定任务)。
我经历了以下似乎相关的问题:using puppeteer、usign javascript、using flutter。所有答案都涉及使用 API,所以它们都不适合我的情况。
我还尝试使用
pyautogui.typewrite(file_path)
和 keyboard.press_and_release(file_path)
,但它们将按键发送到我运行脚本的窗口(终端或 emacs),而不是发送到浏览器打开的窗口。
我建议你使用 whatsapp-web.js 在 Node.js 中实现你的程序,听我说:
如果性能对您来说是一个问题,您可以使用 Baileys 启动 WebSocket 连接,可靠性更高,但该库更复杂,我想更难掌握。我目前是两者的维护者。
我们已经有人尝试将我们所做的事情移植到Python中,但我还没有看到任何成功,我正在开发whatsapp-web.js的v2,它将在今年晚些时候推出,使我们的注入模块化,允许您通过 Python 中的 Selenium 注入它。