簡體   English   中英

硒。 上傳一個新的chrome打開文件上的文件(或者如何在python上模擬ctrl + v)

[英]Selenium. Upload a file on a new chrome open file pop up (or how to simulate ctrl+v on python)

我正在為chrome webdriver做一個python selenium腳本,我需要上傳一個文件。 當我點擊上傳按鈕時,彈出一個打開的文件對話框,我無法實際上傳文件。 我試過的Aproaches:

使用selenium ide,並記錄我上傳文件。 它產生了這個結果:

driver.find_element_by_id("html5_1aq7art6u98a1i1eokfk581u443").clear()
driver.find_element_by_id("html5_1aq7art6u98a1i1eokfk581u443").send_keys("")

但是,每次重新加載頁面時,id都會更改,因此這種方法無法正常工作。 我也找不到找到表單來鍵入文件名的方法。

我也嘗試使用警報並用硒改變窗口

driver.switch_to_window("Open")
driver.send_keyssend_keys(os.getcwd()+"/file.png")

alert = driver.switch_to.alert
alert.send_keyssend_keys(os.getcwd()+"/file.png")

但這兩種方法都失敗了。 (第一個沒有找到窗口,第二個告訴我沒有打開警報)

作為最后的手段我在搜索如何復制到剪貼板的文件的名稱,並在點擊上傳按鈕后,等待類似於秒,然后使用python模擬“crtl + v”,然后按“enter”鍵按,但我不知道該怎么做,互聯網搜索把我帶到一些基於c的第三方庫的黑暗路徑,這讓我有些不知所措。

以下是發布腳本的完整代碼,其余代碼(在此部分之前)僅刪除並刪除我自己的帖子:

driver.get('https://www.kijiji.ca/p-post-ad.html?categoryId=87')


time.sleep(2)
driver.find_element_by_css_selector("button.button--jss-0-514").click()
driver.find_element_by_id("postad-title").clear()
driver.find_element_by_id("postad-title").send_keys(postTitle)
driver.find_element_by_id("pstad-descrptn").clear()
driver.find_element_by_id("pstad-descrptn").send_keys(postContent)
driver.find_element_by_id("pstad-map-address").clear()
driver.find_element_by_id("pstad-map-address").send_keys(postAdress)

#driver.find_element_by_id("ImageUploadButton").click()
#time.sleep(2)

driver.find_element_by_xpath("//input[@type='file'][contains(@id,'html5_')]").clear()
driver.find_element_by_xpath("//input[@type='file'][contains(@id,'html5_')]").send_keys("file.png")
driver.find_element_by_id("PhoneNumber").clear()
driver.find_element_by_id("PhoneNumber").send_keys(phoneNumber)
driver.find_element_by_id("pstad-email").send_keys(profile)
driver.find_element_by_name("saveAndCheckout").click()

完整錯誤:[10360:7760:0815/140356:錯誤:latency_info.cc(164)] RenderWidgetHostImpl :: OnSwapCompositorFrame,LatencyInfo矢量大小187太大。 [10360:7760:0815/140357:ERROR:latency_info.cc(164)] RenderWidgetHostImpl :: OnSwapCompositorFrame,LatencyInfo矢量大小452太大。 回溯(最近一次調用最后一次):文件“KijijiAutoPosting.py”,第95行,在driver.find_element_by_xpath(“// input [@ type ='file'] [contains(@ id,'html5 _')]”)。清除()文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ webelement.py”,第87行,清除self._execute(命令.CLEAR_ELEMENT)文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ webelement.py”,第461行,在_execute中返回self._parent .execute(command,params)文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ webdriver.py”,第236行,執行中self.error_handler.check_response(response)文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ errorhandler.py”,第192行, check_response raise exception_class(message,screen,stacktrace)selenium.common.exceptions.InvalidElementStateException:消息:invalid eleme nt state:元素當前不可交互,可能無法操作(會話信息:chrome = 52.0.2743.116)(驅動程序信息:chromedriver = 2.9.248315,platform = Windows NT 6.3 x86_64)

請嘗試以下代碼:

driver.find_element_by_xpath("//input[@type='file']").clear()
driver.find_element_by_xpath("//input[@type='file']").send_keys("/path/to/file")

如果只有一個文件上傳按鈕,這應該有效。

你也可以嘗試這個XPath

"//input[@type='file'][contains(@id,'html5_')]"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM