因此,我在Python 3.5上运行Selenium,试图单击一个以JavaScript函数为href的按钮。我尝试过帮助他人的解决方案,但我的问题不会改变。
版本库存:
- 硒3.0.2
- Python 3.5.2 on Anaconda 4.1.1
- Firefox 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在任何情况下都无法运行脚本。这令人困惑,因为手动点击打开的网络驱动程序窗口中的链接可以完美地运行并加载下一页。我通过网络驱动程序启用了JavaScript。FirefoxProfile()对象。
下面(尽管很混乱)的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
更新:[RRESOLVED]感谢Lauda建议使用更简单/更干净的样式,使用其href中包含的唯一代码段和find_element_by_xpath()方法来定位锚点标记。下面的代码就像一个魅力:
choose_account = driver.find_element_by_xpath("//a[contains(@href,'SWEForm11_0,c_45')]")
choose_account.click()
尝试使用更好的选择器进行常规单击。
css:a[href*=SWESubmitForm]
使用部分href
值的xpath://a[包含(@href,'SWESubmitForm')]
使用完整href
值的xpath://a[@href='add_entire_href_value_here']