簡體   English   中英

Python Selenium:execute_script 是否可以等待 javascript 內容加載?

[英]Python Selenium : is execute_script able to wait for javascript content to load?

我正在嘗試使用 python 和 selenium(使用 safari)自動執行一個簡單的操作:我有一個網頁,上面有一個列表,從“A”到“Z”,每個字母在頁面上激活一個 Javascript(至少我猜猜,我不太了解 Javascript 和 HTML)當你點擊它時,在要重新加載的字母列表下方制作一個表格 output 股票列表(“A”給你以字母 A,“B”開頭的股票所有以字母 B 開頭的股票,等等...)我的目標是單擊每個按鈕,列出表格中的所有股票,將列表存儲在 Python 中,然后將 go 存儲到下一個字母中。 所以我創建了一個方法,點擊作為參數傳遞的字母,但我希望 python 等待表“加載”,然后再允許它到 go 到我的代碼的下一行,因為現在它正在作為腳本創建問題在加載表格之前繼續下一個字母。

我用來點擊按鈕的命令是:

driver.execute_script("arguments[0].click();",driver.find_element_by_xpath(f"//li[text()='{Stock_Letter.upper()}']"))

其中 driver 是我的 selenium webdriver,而 Stock_Letter 是方法的參數,其中包含我要單擊的元素循環我使用的所有字母:

    alphaB = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

    for lettre in alphaB:
        Session.GoToGamePage(page='buysell', Stock_Letter=lettre.upper())

(session是我的Object,GoToGamePage是我用來點擊預期字母的方法,它包含其他游戲相關的東西)

我嘗試使用 selenium 的 wait.until 方法,但問題是表的第一個元素具有相同的 HTML 屬性,無論字母如何,所以除非它存在 selenium 預期條件來等待特殊文本,否則我不會知道怎么做嗎? 或者甚至是等待屬性的第一個字母成為某個值的預期條件,但我找不到關於預期條件的完整文檔? 我的第一個猜測是在 execute_script 命令中編寫等待代碼,但我真的不知道該怎么做? 如果您需要有關網頁本身的任何更多信息,請告訴我,這是第一個表格行數據:

<td class="allf"><a href="display-EDENp.aspx">EDENRED</a></td>

相關網頁是這個: https://school.abcbourse.com/skemafinance/tab_market.aspx

但您需要在https://school.abcbourse.com/skemafinance上創建一個帳戶(非常快)並使用代碼 195(如果您願意,請隨時參加交易競賽!)

可能對某人有用- python selenium

在此示例中,我使用 SweetAlert2 ( https://sweetalert2.github.io/#usage ) 彈出警報,然后使用 WebDriverWait 等待知道何時關閉警報並繼續我的代碼:

result = df.to_html(classes='table table-striped table-hover', header = "true", justify = "center")
result = result.replace('\n','').replace('<thead>', '<thead class="thead-dark">')

driver.execute_script(
        '''
        Swal.fire({
  title: '<strong><u>Item Found</u></strong>',
  html:'%s',
  showCloseButton: true,
  showCancelButton: true,
  imageHeight: 1000,
  focusConfirm: false,
})
        ''' % result)

while True:
    try:

        element_present = EC.presence_of_element_located((By.XPATH,'//div[@class="swal2-popup swal2-modal swal2-show"]'))
        WebDriverWait(driver, 1).until(element_present)
    except:
        break

要回答你的第一個問題——不, execute_script不會做任何等待。 它只是在頁面上運行一些 Javascript,僅此而已。 您提到表中的第一個元素與所有其他元素具有相同的 HTML 屬性,因此您不能只等待該元素。 那講得通。

您可以嘗試等待選擇器定位的所有元素的存在,看看是否有幫助。

WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, "//li[text()='{Stock_Letter.upper()}']")))

您還可以使用text_to_be_present_in_element等待element.Text等於某物,或者您可以等待text_to_be_present_in_element_value等待元素的value屬性等於某物,具體取決於 HTML 的樣子。

本文檔可能會有所幫助:

https://selenium-python.readthedocs.io/waits.html

暫無
暫無

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

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