在Python中选择一个文件以附加到使用selenium的whatsapp网络聊天

问题描述 投票:0回答:1

我想使用 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 puppeteerusign javascriptusing flutter。所有答案都涉及使用 API,所以它们都不适合我的情况。

我还尝试使用

pyautogui.typewrite(file_path)
keyboard.press_and_release(file_path)
,但它们将按键发送到我运行脚本的窗口(终端或 emacs),而不是发送到浏览器打开的窗口。

python selenium-webdriver whatsapp
1个回答
0
投票

我建议你使用 whatsapp-web.js 在 Node.js 中实现你的程序,听我说:

  • 性能还可以,自从推出了 puppeteer 以来它消耗了大量的 RAM 和资源,但它是免费的
  • 您可以直接从 Node.js 访问所有 WhatsApp Web 及其功能,我们的库注入了 JavaScript

如果性能对您来说是一个问题,您可以使用 Baileys 启动 WebSocket 连接,可靠性更高,但该库更复杂,我想更难掌握。我目前是两者的维护者。

我们已经有人尝试将我们所做的事情移植到Python中,但我还没有看到任何成功,我正在开发whatsapp-web.js的v2,它将在今年晚些时候推出,使我们的注入模块化,允许您通过 Python 中的 Selenium 注入它。

© www.soinside.com 2019 - 2024. All rights reserved.