gpt4 book ai didi

ruby - 如何基于 capybara 中的元素发送 JavaScript

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:08 26 4
gpt4 key购买 nike

我想在 capybara 中做这样的事情:

browser.execute_script("arguments[0].setAttribute('value', 'value')", element)

上面的行是在 selenium/ruby 上运行的,但是将 execute_script 与 capybara 一起使用只需要 1 个参数(脚本),因此我无法定义我希望在其上执行脚本的元素......有什么想法吗?

最佳答案

选项 1 - 直接调用 Selenium 的 execute_script

最快的解决方案是绕过 Capybara API 并直接调用 Selenium-WebDriver 的 execute_script 方法。

为此,您需要使用以下方法访问底层的 Selenium::WebDriver::Driver:

page.driver.browser

此外,传递给 Selenium 的 execute_script 的元素需要是 Selenium::WebDriver::Element(而不是 Capybara::Node::Element)。这是通过以下方式完成的:

element.native

例如,假设您有一个带有文本字段的页面:

<input value="5" id="field">

然后以下将更改字段的值:

element = find('#field')
p element.value
#=> "5"
page.driver.browser.execute_script("arguments[0].setAttribute('value', 'value')", element.native)
p element.value
#=> "value"

选项 2 - 修补 capybara 以允许参数

如果您需要经常这样做,您可以对 Capybara 的 execute_script 方法进行猴子修补以获取参数,将参数转换为 Selenium 对象,然后将其传递给 Selenium-WebDriver 的方法。补丁将是:

require 'capybara'

class Capybara::Session
def execute_script(script, *args)
@touched = true
driver.execute_script(script, *args)
end
end

class Capybara::Selenium::Driver
def execute_script(script, *args)
args.map! { |e| e.kind_of?(Capybara::Node::Element) ? e.native : e }
browser.execute_script(script, *args)
end
end

这将允许您将 Capybara 元素传递给 session execute_script 方法:

element = page.find('#field')
p element.value
#=> "5"
page.execute_script("arguments[0].setAttribute('value', 'value')", element)
p element.value
#=> "value"

关于ruby - 如何基于 capybara 中的元素发送 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26913436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com