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

时间:2019-01-14 19:56:28

标签: javascript python facebook selenium-webdriver dom-events

我正在尝试让Selenium网络驱动程序(由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行       image.find_element_by_xpath(“ // input [包含(@title,'选择要上传的文件')]”“)。send_keys(os.getcwd()+'test.png')
    send_keys中的文件“ C:\ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py”,第479行       '值':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”,执行       self.error_handler.check_response(响应)
    文件“ C:\ Users \ Maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,第242行,在check_response中       引发exception_class(消息,屏幕,堆栈跟踪)
  selenium.common.exceptions.ElementNotInteractableException:消息:键盘无法访问元素<< input id =“ js_h” class =“ _ n _5f0v” type =“ file” >>

那个<>是<input id="js_h" class="_n _5f0v" type="file">,在HTML的任何地方都找不到。有人知道吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Autoit及其编辑器来执行此类文件上传操作,只需找到要在其上上传文件的元素按钮,然后在需要执行autoit文件的按钮操作上就可以简单地执行此操作只需运行按钮上的click命令,然后选择您描述的文件并上传即可。

我下面有分享链接,因此您可以轻松了解

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

答案 1 :(得分: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。