【问题标题】:Is there a way to confirm that jQuery is present on a webpage using Python/Selenium Webdriver?有没有办法使用 Python/Selenium Webdriver 确认 jQuery 存在于网页上?
【发布时间】:2018-01-27 14:34:24
【问题描述】:

我们有一个使用 Selenium Webdriver(用 Python 编写)的自制自动化测试框架。它使用地图将对象的名称链接到网页中的标识符。不幸的是,我们似乎遇到了一个问题,即我们没有等待足够长的时间来完成 AJAX 调用(我们正在解决一些性能问题)。

现在感谢 stackoverflow 和其他互联网资源,我发现了以下代码段:

在决定与对象交互之前插入到框架中

    try:
    WebDriverWait(driver, 5).until(ajax_complete, "Ajax check waited 5 seconds")
except TimeoutException:
    logger1.info("Warning: waited 5 seconds)

然后这是 ajax_complete 的代码:

def ajax_complete(driver):
try:
    return 0 == driver.execute_script("return jQuery.active")
except WebDriverException:
    pass

问题是某些页面(登录屏幕)没有 jQuery,所以我总是陷入 TimeoutException。我知道目前最上面的代码段将在 5 秒后超时并显示一条日志消息,但由于我们的性能问题,我需要将其更改为 60 秒。这意味着登录页面将有 3 分钟的等待时间(1 分钟用于输入用户名,1 分钟用于输入密码,1 分钟用于点击登录按钮)同时等待 Ajax 检查超时,因为 jQuery 只是不存在页面。

在进行 WebDriverWait 检查之前,我是否可以寻找一些东西来确认网页上确实存在 jQuery?做一些脚本元素检查就足够了吗?

喜欢:

if driver.find_element_by_tagname("<script>")

如果返回 True,那么页面上有一个脚本 - 不一定是 jQuery,但它会更接近,也许可以使用更具体的 find_element_by。困难的部分是我正在尝试检查是否有负面影响(jQuery 不存在)。

【问题讨论】:

    标签: jquery python ajax selenium


    【解决方案1】:

    您可以检查jQuery“global”是否用脚本定义:

    is_jquery_present = driver.execute_script("return (typeof jQuery != 'undefined');")
    

    这需要测试,因为页面加载 jQuery 本身也需要时间。

    寻找特定的script 可能适用于某些页面,但无法保证“导入”jquery 库的方式,例如,至少,JS 源代码可能会被打包和缩小。

    【讨论】:

    • 这是一个想法,我可以像包装 jQuery.active 一样包装它,然后先检查它。如果没有找到它,请不要检查它是否处于活动状态。我试试看
    • 这成功了!基本上我只是添加了一个 if 语句,如果 true 将检查 ajax 运行 'if driver.execute_script("return (typeof jQuery != 'undefined');")' 后跟 try 块。我也打算试试下面的建议。
    【解决方案2】:

    您可以选择短路您的支票。

    return 0 == driver.execute_script("return (jQuery || {}).active")
    

    如果 jQuest 不存在,它将使用一个空对象,其中 active 不会在其中。

    或者,如果 jQuery 不存在,你希望它是真的

    return 0 == driver.execute_script("return (jQuery || { active: 0 }).active")
    

    【讨论】:

    • 这也很有效,但是 jQuery 建议的 typeof 更明确带来了更快的响应。只是让您的短路想法最终在登录页面上等待每个对象的全部持续时间(3 分钟)。
    • 很奇怪,想知道为什么。你做的是第一版还是第二版?如果 jQuery 不存在,第一个总是返回 false,而第二个总是返回 true。
    猜你喜欢
    • 2020-03-21
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多