【发布时间】:2020-07-05 09:23:33
【问题描述】:
我使用 selenium 在 python 中编写了一个脚本来登录网站,然后转到目标页面以上传 pdf 文件。该脚本可以成功登录,但在上传 pdf 文件时会抛出 element not interactable 错误。这是landing_page,其中脚本首先单击Your Profile 旁边的按钮并分别使用SIM.iqbal_123 和SShift_123 登录该站点,然后使用此target_link 上传该文件。要上传该文件,必须先点击select 按钮,然后点击cv 按钮。但是,当它应该单击cv 按钮以上传pdf 文件时,该脚本会引发以下错误。
我试过了:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
landing_page = 'https://jobs.allianz.com/sap/bc/bsp/sap/zhcmx_erc_ui_ex/desktop.html#/SEARCH/RESULTS/'
target_link = 'https://jobs.allianz.com/sap/bc/bsp/sap/zhcmx_erc_ui_ex/desktop.html#/APPLICATION/57274787/2/'
driver = webdriver.Chrome()
wait = WebDriverWait(driver,30)
driver.get(landing_page)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,".profileContainer > button.trigger"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"input[name='alias']"))).send_keys("SIM.iqbal_123")
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"input[name='password']"))).send_keys("SShift_123")
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"button.loginBtn"))).click()
driver.get(target_link)
button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"button[class*='uploadBtn']")))
driver.execute_script("arguments[0].click();",button)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"form[class='fileForm'] > label[data-type='12']")))
elem.send_keys("C://Users/WCS/Desktop/CV.pdf")
脚本指向最后一行时遇到的错误:
Traceback (most recent call last):
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\keep_it.py", line 22, in <module>
elem.send_keys("C://Users/WCS/Desktop/CV.pdf")
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 479, in send_keys
'value': keys_to_typing(value)})
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
(Session info: chrome=80.0.3987.149)
这就是我尝试使用无法上传文件的请求的方式:
import requests
from bs4 import BeautifulSoup
aplication_link = 'https://jobs.allianz.com/sap/opu/odata/hcmx/erc_ui_auth_srv/AttachmentSet?sap-client=100&sap-language=en'
with requests.Session() as s:
s.auth = ("SIM.iqbal_123", "SShift_123")
s.post("https://jobs.allianz.com/sap/hcmx/validate_ea?sap-client=100&sap-language={2}")
r = s.get("https://jobs.allianz.com/sap/opu/odata/hcmx/erc_ui_auth_srv/UserSet('me')?sap-client=100&sap-language=en", headers={'x-csrf-token':'Fetch'})
token = r.headers.get("x-csrf-token")
s.headers["x-csrf-token"] = token
file = open("CV.pdf","rb")
r = s.post(aplication_link,files={"Slug":f"Filename={file}&Title=CV%5FTEST&AttachmentTypeID=12"})
print(r.status_code)
顺便说一句,这是pdf 文件,以防你想测试。
如何使用 send_keys 或 requests 上传 pdf 文件?
编辑:
我已经对我的existing script 进行了一些更改,它现在适用于link,在此可见为Cover Letter,但当它适用于此link,可见为Documents。它们几乎完全相同。
【问题讨论】:
-
您想将密钥发送到 标记,类型为“文件”。
-
不要点击浏览按钮,只发送密钥。
-
点击是为了让
select按钮打开隐藏的cv按钮。但是,当我单击cv按钮并选择文件时,文件会被上传。 -
尝试 element.send_keys,然后尝试 element.submit()... 这可能有效也可能无效... 这取决于他们对 javascript 提交的依赖程度。如果这不起作用,请发布使用的标记/脚本。
-
我认为错误是因为您打开了文件浏览对话框。发布当前的代码试验和标记 + 脚本。
标签: python python-3.x selenium selenium-webdriver web-scraping