【问题标题】:Executing javascript in python results in KeyError在 python 中执行 javascript 会导致 KeyError
【发布时间】:2019-12-19 10:38:46
【问题描述】:

我在尝试在 python selenium 中执行脚本时遇到了困难...我正在尝试检查某个元素是否在指定的父级中,如果是,它应该返回 true。

这是我的代码:

    for box in range(len(browser.find_elements(*selector))):

    result = browser.execute_script("""
    var nodesArray = Array.prototype.slice.call(document.querySelectorAll(".o-boxes__item"));
    if(document.querySelector("div:nth-child({}) > div > div.m-package-box__body > div:nth-child(10) > div > label") === nodesArray[{}]){
        false
    }else{
        nodesArray[{}].contains(document.querySelector("div:nth-child({}) > div > div.m-package-box__body > div:nth-child(10) > div > label"));
    }""".format(box+1, box, box, box+1))
    print(str(result)) 

当我运行它时,它会在控制台中给我这个输出:

nodesArray[{}].contains(document.querySelector("div:nth-child({}) > div > div.m-package-box__body > div:nth-child(10) > div > label"));
>           }""".format(box+1, box, box, box+1))
E           KeyError: '\n            false\n        '

tests/test_shopEshop.py:111: KeyError

我不知道我还能做什么...我尝试更改 execute_script 部分中的代码,尝试更改字符串格式(f 格式、.format 方法、硬编码参数)但没有任何效果,并且我开始放弃了……

【问题讨论】:

  • 你在用python的时候为什么要在JS里做这么多?您应该能够仅使用 python 完成所有这些操作。如果您发布相关的 HTML(作为文本)会更好,这样我们就可以确定您的定位器是否正确/最佳,然后可能会确定更好的方法。
  • 问题出在box+1。在最后一个循环框+1 大于范围长度。
  • 您可以先将变量nodesArray 替换为find_elements_by_xpath("//*[@class='o-boxes__item']") 之类的东西。如果你能得到我们甚至只是一个 html 的复制粘贴,那会有所帮助。 driver.page_source 将返回整个页面。

标签: javascript python string selenium formatting


【解决方案1】:

@Jortega 这是我的全部测试

    def test_package_box_href(browser, base_url, testrail_data_file, commentary):
    '''
        Sprawdza czy atrybut href w button w package boxie zgadza
        się z adresem URL do którego prowadzi oraz przy zmianach zaznaczonego toggle
    '''
    Menu(browser).go_to_page(Menu(browser).SHOP, Menu(browser).SHOP_SHOP)
    page_old = GenericTemplateOld(browser)

    testrail = ApiTestrailRequest(testrail_data_file["run_id"], '32252')
    verification = Assertions(browser, testrail_data_file, commentary)

    selector = page_old.PACKAGE_BOXES_BUTTON

    WebDriverWait(browser, 10).until(
            EC.url_to_be(base_url + '/sklepy-internetowe/')
        )

    for box in range(len(browser.find_elements(*selector))):

        print(len(browser.find_elements(*selector)))
        script ="""
        var nodesArray = Array.prototype.slice.call(document.querySelectorAll(".o-boxes__item"));

        if(document.querySelector("div:nth-child({}) > div > div.m-package-box__body > div:nth-child(10) > div > label") === nodesArray[{}]){
            return false;
        }else{
            return nodesArray[{}].contains(document.querySelector("div:nth-child({}) > div > div.m-package-box__body > div:nth-child(10) > div > label"));
        }
        """.format(1,0,0,1)

E KeyError: '\n return false;\n '

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我删除了 .format() 并使用了老式的 % 格式, 像这样

    stuff_in_string = "Shepherd %s is %d years old." % (shepherd, age)
    
    print(stuff_in_string)
    

    希望这对您的情况有所帮助,我相信 .format 会查找 {} 括号,这会导致它将其中的任何内容视为变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 2017-11-04
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多