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) 当你点击它时,在字母列表下面制作一个 table 重新加载并输出股票列表("A" 给你以字母开头的股票A, "B" 所有以字母 B 开头的股票,等等...)
我的目标是单击每个按钮,列出 table 的所有股票,将列表存储在 Python 中,然后转到下一个字母。
所以我创建了一个方法,点击作为参数传递的字母,但我希望 python 等待 table 到 'load',然后再允许它转到我的代码的下一行因为现在它正在产生问题,因为脚本在加载 table 之前继续下一个字母。
我用来点击按钮的命令是:
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 方法,但问题是 table 的第一个元素具有相同的 HTML 属性,无论字母如何,所以除非它存在等待特殊文本的硒预期条件,我不知道该怎么做?或者甚至是等待属性的第一个字母成为某个值的预期条件,但我找不到关于预期条件的完整文档?
我的第一个猜测是在 execute_script 命令中编写等待代码,但我真的不知道该怎么做?
如果您需要有关网页本身的任何更多信息,请告诉我,这是第一个 table 行数据:
<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(如果您愿意,请随时参加交易竞赛!)
回答你的第一个问题 -- 不,execute_script
不做任何等待。它只是在页面上运行一些 Javascript,仅此而已。您提到 table 中的第一个元素与所有其他元素具有相同的 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 的样子。
此文档可能会有所帮助:
可能对某人有用- 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
我正在尝试使用 python 和 selenium(使用 safari)自动执行一个简单的操作: 我有一个网页,上面有一个列表,从 "A" 到 "Z",每个字母都会在页面上激活一个 Javascript(至少我猜,我不太了解Javascript 和 HTML) 当你点击它时,在字母列表下面制作一个 table 重新加载并输出股票列表("A" 给你以字母开头的股票A, "B" 所有以字母 B 开头的股票,等等...) 我的目标是单击每个按钮,列出 table 的所有股票,将列表存储在 Python 中,然后转到下一个字母。 所以我创建了一个方法,点击作为参数传递的字母,但我希望 python 等待 table 到 'load',然后再允许它转到我的代码的下一行因为现在它正在产生问题,因为脚本在加载 table 之前继续下一个字母。
我用来点击按钮的命令是:
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 方法,但问题是 table 的第一个元素具有相同的 HTML 属性,无论字母如何,所以除非它存在等待特殊文本的硒预期条件,我不知道该怎么做?或者甚至是等待属性的第一个字母成为某个值的预期条件,但我找不到关于预期条件的完整文档? 我的第一个猜测是在 execute_script 命令中编写等待代码,但我真的不知道该怎么做? 如果您需要有关网页本身的任何更多信息,请告诉我,这是第一个 table 行数据:
<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(如果您愿意,请随时参加交易竞赛!)
回答你的第一个问题 -- 不,execute_script
不做任何等待。它只是在页面上运行一些 Javascript,仅此而已。您提到 table 中的第一个元素与所有其他元素具有相同的 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 的样子。
此文档可能会有所帮助:
可能对某人有用- 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