【问题标题】:Unable to execute javascript in onclick using selenium无法使用 selenium 在 onclick 中执行 javascript
【发布时间】:2013-07-25 06:49:47
【问题描述】:

使用 selenium(带有 python 绑定),我正在处理一个几乎完全是 AJAX 的网页;包括超链接。我不想使用 element.click() 方法,而是希望在标签的“onclick”属性中执行 javascript:

标签:

<a onclick="javascript:setEvent(event);requisition_openRequisitionDescription('requisitionListInterface','actOpenRequisitionDescription',_ftl_api.lstVal('requisitionListInterface', 'requisitionListInterface.listRequisition', 'requisitionListInterface.d327682e687', this),'requisitionList');return ftlUtil_followLink(this);" href="#" title="View this job description" id="requisitionListInterface.reqTitleLinkAction.row1">

代码:

from selenium import webdriver
firefox = webdriver.Firefox()
firefox.get("some_url")
elem = firefox.find_element_by_id("requisitionListInterface.reqTitleLinkAction.row1")
jcode = elem.get_attribute("onclick")
firefox.execute_script(jcode)

错误:

WebDriverException: Message: u'event is not defined' ; Stacktrace:

免责声明:

我不懂 Javascript。据我所知,它期待“事件”变量,但我猜它与回调有关?

编辑:

我假设 javascript 正在修改 href 属性,但是 javascript 是否可以在不修改超链接的情况下重定向浏览器?

【问题讨论】:

    标签: javascript python selenium


    【解决方案1】:

    你可以用这个点击它。

    elem.click()
    

    onclick 事件会自动触发。

    【讨论】:

    • 是的,我知道这一点,但我希望记录 javascript 创建的状态更改,而简单地执行 elem.click() 不允许我这样做。
    • 您可以提取 HAR 文件来执行此操作! server.start(); server.newHar("HAR"); elem.click() Har cc=server.getHar(); cc.writeTo(new File("harfile.har")); server.stop();
    • 我认为代码是Javascript,需要放入onclick?
    • 我给出了一个java解决方案。您可以使用您使用的语言搜索获取 HAR
    【解决方案2】:

    除非 selenium 做了一些疯狂的事情,我怀疑,onclick="javascript:setEvent(event) 不是有效的 javascript。但是字符串的其余部分是。当这个代码块被执行时,它会尝试调用一个名为 setEvent 的函数带有变量事件,它仍然未定义。

    <a onclick="requisition_openRequisitionDescription('requisitionListInterface','actOpenRequisitionDescription',_ftl_api.lstVal('requisitionListInterface', 'requisitionListInterface.listRequisition', 'requisitionListInterface.d327682e687', this),'requisitionList');return ftlUtil_followLink(this);" href="#" title="View this job description" id="requisitionListInterface.reqTitleLinkAction.row1">
    

    既然脚本中没有其他地方需要事件,只需将其删除?

    【讨论】:

    • 感谢您的回复。我已经尝试过您的建议,但是它并没有达到与单击链接相同的结果,因此“事件”组件必须有一些影响。您知道“记录”所有由 javascript 触发的文档和页面重定向的方法吗?
    【解决方案3】:
    from selenium.webdriver.common.action_chains import ActionChains
    firefox = webdriver.Firefox()
    # You need a mouse to hover the span elements here, and please try this way :)
    self.mouse = webdriver.ActionChains(firefox)    
    
    # You need get the span element from its xpath:
    elem = firefox.find_element_by_id("requisitionListInterface.reqTitleLinkAction.row1")
    
    # Then you hover on span element by mouse and click on it:
    self.mouse.move_to_element(elem).click().perform()
    

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多