【问题标题】:Selenium/Python: JavaScript href refuses to executeSelenium/Python:JavaScript href 拒绝执行
【发布时间】:2017-06-19 21:09:09
【问题描述】:

所以,我在 Python 3.5 上运行 Selenium,试图单击一个以 JavaScript 函数作为其 href 的按钮。我已经尝试过帮助其他人的解决方案,但我的问题不会改变。

版本清单:

  • 硒 3.0.2
  • Anaconda 4.1.1 上的 Python 3.5.2
  • 火狐 51.0.1

按钮的html如下:

<tbody>
    <tr>
        <td>
            <a href='JavaScript:SWESubmitForm(document.SWEForm11_0,c_45,"s_11_1_0_0","")' tabindex="1700">Choose Account</a>
        </td>
    </tr>
    <tr>
        <td>View a different account</td>
    </tr>
</tbody>

解决方案我已经尝试将所有移动到正确框架中的正确元素,并且看起来好像正在执行单击而没有引发任何异常,但是 Selenium 无法让脚本在任何情况下运行。这令人费解,因为手动单击打开的 webdriver 窗口中的链接可以完美运行并加载下一页。我通过 webdriver.FirefoxProfile() 对象启用了 JavaScript。

下面的(虽然很乱)xpath 是我找到的移动到正确元素的最佳方式,它每次都能找到正确的元素,但是它在任何条件下都不会执行脚本。

choose_account = driver.find_element_by_xpath('//*[/html/body/table[3]/tbody/tr/td[3]/\
span[1]/form/table[2]/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[2]/td[2]/\
table/tbody/tr[1]/td/a]')

方法一[失败]:将鼠标直接移动到元素上并点击。方法运行时不会引发错误或异常。页面不变。 JS 不执行

action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(choose_account, 0, 0)
action.click()

方法二 [失败并出现错误]: 尝试完全按照元素的 href 值中所写的方式运行脚本。抛出异常:

driver.execute_script('SWESubmitForm(document.SWEForm11_0,c_45,"s_11_1_0_0","").click();')

抛出的异常:

ReferenceError: SWESubmitForm is not defined

方法三[失败]:尝试在元素上使用 JavaScript 执行器。方法运行时不会引发错误或异常。页面不变。 JS 不执行

driver.execute_script("arguments[0].click();", choose_account)

有人对这里可能发生的事情有任何见解吗?我真的很茫然。

M

更新:[已解决] 感谢 Lauda 建议使用包含在其 href 和 find_element_by_xpath() 方法中的唯一 sn-p 来使用更简单/更清洁的定位锚标记的方式。 下面的代码就像一个魅力:

choose_account = driver.find_element_by_xpath("//a[contains(@href,'SWEForm11_0,c_45')]")
choose_account.click()

【问题讨论】:

  • 您可以尝试在driver.find_element_by_link_text("Choose Account").click() 之前添加几秒钟的time.sleep(3) 吗?结果一样吗?
  • Andersson,我试过你的 find_element_by_link_text 并且效果很好。看起来问题是我在最初尝试中使用的笨拙的 xpath。

标签: javascript python selenium


【解决方案1】:

尝试使用带有更好选择器的常规点击。

css: a[href*=SWESubmitForm]

xpath 使用部分href 值://a[contains(@href, 'SWESubmitForm')]

xpath 使用完整的href 值://a[@href='add_entire_href_value_here']

【讨论】:

  • 解决了。非常感谢。我必须进一步指定,因为在页面侧边栏中的每个锚标记中都找到了“SWESubmitForm”,所以对我来说,使用从更远的 href 开始的唯一字符串 'SWEForm11_0,c_45' 是必要的。
  • 实际上,第二种建议的方法是不正确的。 contains() 作为contains(@href, 'SWESubmitForm') 工作,但不能作为contains(@href='SWESubmitForm')
  • 是的,你是对的,我会更新它,我添加的案例是针对整个价值,而不是它的一部分。
  • 是的,我先用“=”尝试了这个建议,但失败了。使用“,”仅与完整href的sn-p完美配合。更正了我对上面原始帖子的更新中包含的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2016-04-15
  • 1970-01-01
  • 2018-08-20
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多