Selenium Python:检查JS变量是否为真

时间:2017-09-18 09:08:53

标签: python selenium-webdriver web-scraping

我正在尝试使用python中的selenium包来加载要保存的动态网站。但我的成功喜忧参半。我注意到成功保存的页面与不成功保存的页面之间存在差异。在成功的HTML源代码中,我看到了

<script language="javascript" type="text/javascript">
var PageIsReady = true;
</script>

而对于其他人,var PageIsReady为false。有没有办法在变量变为真后触发保存?

这个stackoverflow question显示了如何进行超时,但是当我希望它触发脚本变量的值时,它会查找标记的存在。

2 个答案:

答案 0 :(得分:3)

解决此问题的一个很好的解决方案可能是实现自定义等待条件,它将检查变量是否定义。条件必须看起来像这样(小心,未经过彻底测试):

class js_variable_evals_to_true(object):
    def __init__(self, variable):
        self.variable = variable
    def __call__(self, driver):
        return driver.execute_script("return {0};".format(self.variable))

用法:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

chrome = webdriver.Chrome()
chrome.get("http://google.com")
try:
    element = WebDriverWait(chrome, 10).until(js_variable_evals_to_true("toolbar.visible")
finally:
    chrome.quit()

检查Selenium文档中的source code,了解如何实现自定义等待条件。

答案 1 :(得分:0)

您不必处理PageIsReady的值,只需等到具有精确文字内容的<script>出现在DOM中:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//script[normalize-space()="var PageIsReady = true;"]')))