如何让Selenium更新Facebook个人资料图片

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

我正在尝试制作一个Selenium webdriver(在Firefox的控制下)更新它登录的Facebook帐户的个人资料图片。我使用了典型的建议,即找到文件输入和send_keys我的文件的路径,这是我得到的:

image.find_element_by_xpath("//input[contains(@title,'Choose a file to upload')]").send_keys(os.getcwd()+'test.png')

无论如何,这是我得到的错误:

回溯(最近一次调用最后一次):文件“C:/Users/maste/PycharmProjects/accountGenerator/accountGenerator.py”,第136行,在<module>中 image.find_element_by_xpath(“//输入[包含(@ title,'选择要上传的文件')]”)。send_keys(os.getcwd()+'test.png') 文件“C:\ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py”,第479行,在send_keys'的值':keys_to_typing(value)}) 文件“C:\ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py”,第628行,在_execute中返回self._parent.execute(command,params) 文件“C:\ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,第320行,执行self.error_handler.check_response(response) 文件“C:\ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,第242行,在check_response中引发exception_class(message,screen,stacktrace) selenium.common.exceptions.ElementNotInteractableException:消息:键盘无法访问元素<< input id =“js_h”class =“_ n _5f0v”type =“file”>>

那个<>是<input id="js_h" class="_n _5f0v" type="file">,我根本无法在HTML中的任何地方找到它。有人有想法吗?

javascript python facebook selenium-webdriver dom-events
2个回答
0
投票

您可以使用Autoit及其编辑器进行此类文件上传操作,您只需要找到必须上传文件的元素按钮,然后根据按钮的操作运行自动文件,它只需要做的就是从按钮运行单击命令并选择您描述的文件并上传它。

我有下面的分享链接,所以你可以很容易地理解

https://www.softwaretestingmaterial.com/upload-file-using-autoit/


0
投票

找到元素时会发生异常ElementNotInteractableException,但您无法对其执行任何操作。例如,您可以单击或调用发送密钥,但操作最终会失败。

由于以下多种原因,可能会出现这种情况:

  • 元素不可见/未完全显示
  • 该元素不在屏幕上
  • 隐藏在其他元素后面或隐藏自身的元素
  • 它需要您执行一些操作才能启用它。

在这种情况下,您可以尝试以下方法: -

1.等到元素变得可见或可点击

WebDriverWait letsWait = new WebDriverWait(driver, timeout);
letsWait.until(ExpectedConditions.visibilityOf(item)); 
letsWait.until(ExpectedConditions.elementToBeClickable(item));

2.滚动,直到元素出现在显示屏下方

Actions act = new Actions(driver);
act.moveToElement(item);

3.使用JavaScript处理DOM元素

JavascriptExecutor jScript = (JavascriptExecutor) driver;
jScript.executeScript("var item = document.querySelector('locator'); item.value = 'your choice';")

但是,你也可以阅读这个关于这个问题的GitHub线程,因为其他几个人在它们各自的场景中也面临着这个问题:https://github.com/SeleniumHQ/selenium/issues/5037

顺便说一下,这里有一篇关于handling file uploads using Selenium的帖子,你可以检查一下不同的方法,或者尝试Java而不是Python。

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