使用 Selenium 和 python 为 Instagram 提供上传文件路径

Posted

技术标签:

【中文标题】使用 Selenium 和 python 为 Instagram 提供上传文件路径【英文标题】:Give upload file path to Instagram with Selenium and python 【发布时间】:2018-06-18 14:36:07 【问题描述】:

我正在使用 Selenium 和 Python 在 Instagram 上测试一些网络抓取。

在这种情况下,我想上传一张图片。

通常您必须单击上传图标并从窗口中选择文件。如何使用 Selenium 进行管理?

我试过了:

driver.find_element_by_class_name("coreSpriteFeedCreation").send_keys('C:\\path-to-file\\file.jpg')

还有find_element_by_xpath,但我得到一个例外:

selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element

我也只尝试了click(),但没有任何反应。

有什么想法吗?

编辑 感谢@homersimpson 的评论,我尝试了这个:

actions = ActionChains(driver)
element = driver.find_element_by_class_name("coreSpriteFeedCreation")
actions.move_to_element(element)
actions.click()
actions.send_keys('C:\\path-to-file\\file.jpg')
actions.perform()

现在出现选择文件的窗口。问题是我想避开这个窗口,直接给出我的文件的路径。

【问题讨论】:

这里可能有答案:***.com/a/34547262/1530072 感谢@homersimpson,我编辑了我的问题 你能显示文件上传窗口的 html sn-p 吗? 【参考方案1】:

如果正确理解,您正在尝试避免使用本机窗口进行处理。你可以试试这个:

# get all inputs
inputs = driver.find_elements_by_xpath("//input[@accept = 'image/jpeg']").send_keys(os.getcwd() + "/image.png")

现在您可以尝试所有这些。我不知道它们中的哪一个会起作用。

更多关于os.getcwd()的信息是here

为了能够执行此代码,您必须拥有这样的元素:

<input type="file" name="fileToUpload" id="fileToUpload2" class="fileToUpload">

编辑:

看起来instagram 关闭了帖子的输入字段交互。对于帐户图像,它仍然有效,但不适用于发布。我认为这样做是为了防止机器人发布图像。无论如何,这个问题有一个解决方案。你可以像这样使用 AutoIt:

import autoit
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

ActionChains(driver).move_to_element( driver.find_element_by_xpath("//path/to/upload/button")).click().perform()
handle = "[CLASS:#32770; TITLE:Open]"
autoit.win_wait(handle, 60)
autoit.control_set_text(handle, "Edit1", "\\file\\path")
autoit.control_click(handle, "Button1")

【讨论】:

我总是得到selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element 很高兴听到这个消息,今天我已经达到了反对/反对的限制,所以明天我会赞成你的问题。你有一个很好的) @AndreiSuvorkov :我会为你做的。 小问题,它工作得很好,但它打开了错误的输入。使用您的代码,我可以更改我的个人资料图片。我尝试了 DOM 中的所有输入,但没有成功。有什么想法吗? 我更改了我的xPath。所以我根据新的xPath找到了三个元素。我不知道哪一个是正确的,但其中一个应该可以解决问题。请尝试告诉我它是否有效,以及哪个元素是正确的。【参考方案2】:

我想我可能找到了适合我的解决方案。我发现如果您首先让机器人在浏览器处于移动视图中时单击加号图标。

self.driver.find_element_by_xpath("/html/body/div[1]/section/nav[2]/div/div/div[2]/div/div/div[3]")\
        .click()

在那之后,我会立即将我的文件发送到 HTML 中的输入标记,我发现您可能需要考虑哪个有效,但我发现最后一个输入标记对我有用。

self.driver.find_element_by_xpath("/html/body/div[1]/section/nav[2]/div/div/form/input")\
        .send_keys("/image/path.jpg")

关于此的一个奇怪的事情是您将在页面顶部有一个弹出菜单,但您的代码仍将在此窗口显示在您正在处理的窗口上方时运行。

【讨论】:

【参考方案3】:

除了 HumbleFox 的回答。解决他的弹框不关闭或者文件弹框不关闭的问题(bug)

解决方案是让浏览器无头,这是我的代码的一部分,例如:

mobile_emulation =  "deviceName": "Pixel 2" 
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
chrome_options.binary_location = self.opt.binary_location
self.driver = webdriver.Chrome(executable_path=self.path, options=chrome_options)

【讨论】:

以上是关于使用 Selenium 和 python 为 Instagram 提供上传文件路径的主要内容,如果未能解决你的问题,请参考以下文章

How to click on a point on an HTML5 canvas in Python selenium webdriver

python3+selenium3遇到的问题:Exception ignored in: <bound method Service.__del__ of <selenium.webdri

使用selenium处理python中的多个选项卡时的IndexError

使用 Selenium 和 python 为 Instagram 提供上传文件路径

为采集动态网页安装和测试Python Selenium库

使用 Python 和 Selenium 将 APK 上传到解释为 URL 的网页