(已解决)在使用水豚的无头自动化上单击调用 ajax 函数的元素时无法下载文件
(SOLVED) failed to download file when click the element that call ajax function on headless automation using capybara
我有一个link元素,当user/automation点击link,它会下载一个文件,link是这样的:
<a target="_blank" href="#!" class="downloadFileAws" data-file="report2020-05-20_2020-05-20_jbkd2a1jYFFTyEEUrjiiQBLCQHsjWqj21375.xls" data-path="report">here</a>
当自动化点击 link 时,它将调用 ajax 函数,如下所示:
$('body').on('click', '.downloadFileAws', function(e){
e.preventDefault();
var $this = $(this);
$this.addClass('disabled');
var folderName = $this.attr('data-path');
var fileName = $this.attr('data-file');
$.ajax({
type: 'POST',
url : $('#getUrlFileAws').val(),
data: {
folderName : folderName,
fileName : fileName
},
dataType:'JSON',
success: function (data)
{
$this.removeClass('disabled')
if(data.status === 'success')
{
window.open(data.url,'_blank');
}
else
{
Materialize.toast('File Not Found.<i class="fa fa-times ml25"></i>', 3000,'red accent-4');
}
}
});
})
ajax 函数没有直接附加在 html 页面上,而是位于名为 "mainscript.js" 的 javascript 文件中。文件附加在 html 页面底部,如下所示:
<script type="text/javascript" src="/assets/js/mainscript.js?v=100000301"></script>
然而,当无头自动化试图点击 link 元素时,ajax 函数没有被调用。我试过用不同的方式点击,例如:
find(:css, 'a.downloadFileAws').click
或
page.execute_script('$("a.downloadFileAws").click()')
但似乎没有人工作,我尝试 运行 在非无头模式下自动化,它工作得很好,下载的文件出现在我的自动化项目目录中的下载目录中。
在这里,我将在 env.rb 中为您提供有关我的配置的更多信息:
browser_options = Selenium::WebDriver::Chrome::Options.new
browser_options.add_preference('download.default_directory',
File.absolute_path('./features/data/files/downloaded'))
browser_options.add_preference(:download, default_directory:
File.absolute_path('./features/data/files/downloaded'))
browser_options.add_preference(:browser, set_download_behavior: {
behavior: 'allow' })
browser_options.add_preference('plugins.always_open_pdf_externally', true)
browser_options.add_preference(:plugins, always_open_pdf_externally: true)
Capybara.register_driver :chrome_headless do |app|
browser_options.add_argument('--headless')
browser_options.add_argument('--no-sandbox')
browser_options.add_argument('--disable-gpu')
browser_options.add_argument('--disable-dev-shm-usage')
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
options: browser_options
)
end
Capybara.register_driver :chrome do |app|
profile = Selenium::WebDriver::Chrome::Profile.new
browser_options.add_argument('--user-agent=selenium')
browser_options.add_argument('--start-maximized')
client = Selenium::WebDriver::Remote::Http::Default.new
client.open_timeout = wait_time
client.read_timeout = wait_time
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
options: browser_options,
http_client: client,
profile: profile
)
end
任何帮助将不胜感激,因为我已经被这个问题困了好几天了,所以谢谢大家。
编辑:我已经通过在注册 chrome_headless 驱动程序时添加一些代码解决了这个问题:
Capybara.register_driver :chrome_headless do |app|
browser_options.add_argument('--headless')
browser_options.add_argument('--no-sandbox')
browser_options.add_argument('--disable-gpu')
browser_options.add_argument('--disable-dev-shm-usage')
driver = Capybara::Selenium::Driver.new(
app,
browser: :chrome,
options: browser_options
)
driver.browser.download_path = File.expand_path('./features/data/files/downloaded')
driver
end
下载行为必须根据 Chrome 版本和模式(无头与非无头)设置不同。使用 Capybara 用于其自身测试的配置应该适用于两种模式下的任何最新版本 - 请参阅 https://github.com/teamcapybara/capybara/blob/master/spec/selenium_spec_chrome.rb#L13
您也不应该再使用 desired_capabilities
,并且您绝对应该停止禁用 w3c
模式,除非您使用的是非常旧的 Chrome 版本,在这种情况下请下载在无头模式下可能根本不起作用。
我有一个link元素,当user/automation点击link,它会下载一个文件,link是这样的:
<a target="_blank" href="#!" class="downloadFileAws" data-file="report2020-05-20_2020-05-20_jbkd2a1jYFFTyEEUrjiiQBLCQHsjWqj21375.xls" data-path="report">here</a>
当自动化点击 link 时,它将调用 ajax 函数,如下所示:
$('body').on('click', '.downloadFileAws', function(e){
e.preventDefault();
var $this = $(this);
$this.addClass('disabled');
var folderName = $this.attr('data-path');
var fileName = $this.attr('data-file');
$.ajax({
type: 'POST',
url : $('#getUrlFileAws').val(),
data: {
folderName : folderName,
fileName : fileName
},
dataType:'JSON',
success: function (data)
{
$this.removeClass('disabled')
if(data.status === 'success')
{
window.open(data.url,'_blank');
}
else
{
Materialize.toast('File Not Found.<i class="fa fa-times ml25"></i>', 3000,'red accent-4');
}
}
});
})
ajax 函数没有直接附加在 html 页面上,而是位于名为 "mainscript.js" 的 javascript 文件中。文件附加在 html 页面底部,如下所示:
<script type="text/javascript" src="/assets/js/mainscript.js?v=100000301"></script>
然而,当无头自动化试图点击 link 元素时,ajax 函数没有被调用。我试过用不同的方式点击,例如:
find(:css, 'a.downloadFileAws').click
或
page.execute_script('$("a.downloadFileAws").click()')
但似乎没有人工作,我尝试 运行 在非无头模式下自动化,它工作得很好,下载的文件出现在我的自动化项目目录中的下载目录中。
在这里,我将在 env.rb 中为您提供有关我的配置的更多信息:
browser_options = Selenium::WebDriver::Chrome::Options.new
browser_options.add_preference('download.default_directory',
File.absolute_path('./features/data/files/downloaded'))
browser_options.add_preference(:download, default_directory:
File.absolute_path('./features/data/files/downloaded'))
browser_options.add_preference(:browser, set_download_behavior: {
behavior: 'allow' })
browser_options.add_preference('plugins.always_open_pdf_externally', true)
browser_options.add_preference(:plugins, always_open_pdf_externally: true)
Capybara.register_driver :chrome_headless do |app|
browser_options.add_argument('--headless')
browser_options.add_argument('--no-sandbox')
browser_options.add_argument('--disable-gpu')
browser_options.add_argument('--disable-dev-shm-usage')
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
options: browser_options
)
end
Capybara.register_driver :chrome do |app|
profile = Selenium::WebDriver::Chrome::Profile.new
browser_options.add_argument('--user-agent=selenium')
browser_options.add_argument('--start-maximized')
client = Selenium::WebDriver::Remote::Http::Default.new
client.open_timeout = wait_time
client.read_timeout = wait_time
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
options: browser_options,
http_client: client,
profile: profile
)
end
任何帮助将不胜感激,因为我已经被这个问题困了好几天了,所以谢谢大家。
编辑:我已经通过在注册 chrome_headless 驱动程序时添加一些代码解决了这个问题:
Capybara.register_driver :chrome_headless do |app|
browser_options.add_argument('--headless')
browser_options.add_argument('--no-sandbox')
browser_options.add_argument('--disable-gpu')
browser_options.add_argument('--disable-dev-shm-usage')
driver = Capybara::Selenium::Driver.new(
app,
browser: :chrome,
options: browser_options
)
driver.browser.download_path = File.expand_path('./features/data/files/downloaded')
driver
end
下载行为必须根据 Chrome 版本和模式(无头与非无头)设置不同。使用 Capybara 用于其自身测试的配置应该适用于两种模式下的任何最新版本 - 请参阅 https://github.com/teamcapybara/capybara/blob/master/spec/selenium_spec_chrome.rb#L13
您也不应该再使用 desired_capabilities
,并且您绝对应该停止禁用 w3c
模式,除非您使用的是非常旧的 Chrome 版本,在这种情况下请下载在无头模式下可能根本不起作用。