驱动程序中下载未启动"/>
Selenium:在 firefox 驱动程序中下载未启动
我正在尝试从第三方网站下载文件,所以我无法访问另一端的代码。我在无头模式下使用 firefox webdriver。我无法使用 Chrome 对此进行测试,因为我的服务器没有显示器,并且 Chrome 在尝试以无头模式运行时给我一个错误。我也无法使 Firefox 的浏览器日志记录正常工作(我已经在代码的配置文件部分尝试过此操作,但没有出现日志)所以我无法从 selenium 中获取调试信息,这让事情变得异常困难。如果有人可以提示我如何使用 Firefox 进行这样的下载,我将不胜感激。是否有可能以某种方式获得负责创建文件并通过 selenium 驱动程序启动下载的脚本输出?我相信如果我得到脚本创建的 URL,我可以开始下载。
测试看起来像这样:
获取驱动程序并连接到 url -> 登录 -> 重定向到页面 -> 打开正确的菜单 -> 打开正确的子菜单 -> 打开正确的选项卡 -> 插入开始日期
这部分工作没有问题,但是:
-> 点击“Excel”按钮 -> 下载开始
不管我做什么都拒绝工作。我使用驱动程序的屏幕截图来确认该过程开始和完成,但是当下载应该开始时没有任何反应。
这张图表示进程已经启动,按钮已经被点击:
图为流程进入下一阶段
在此之后,浏览器应立即执行 GET 查询(很可能由 javascript 触发,我无法验证)并获取正确的文件。手动执行此操作时,下载在普通浏览器上没有单独的弹出窗口的情况下开始,因此它也不应该要求它提供硒。
我将粘贴负责查询的代码。这是创建驱动程序并获取配置文件和选项的文件:
const webdriver = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const firefox = require('selenium-webdriver/firefox');
const edge = require('selenium-webdriver/edge');
const chromium = require('chromium');
const FirefoxProfile = require("firefox-profile");
const {Builder, Browser, By, Key, until} = require('selenium-webdriver');
require('chromedriver');
require('geckodriver');
async function loginWithForm(driver, url, formOpts, formData){
await driver.get(url)
await driver.findElement(By.name(formOpts.username)).sendKeys(formData.username);
await driver.findElement(By.name(formOpts.password)).sendKeys(formData.password);
if(!formOpts.submit){
var result = await driver.findElement(By.className('btn-primary')).click();
}else if(formOpts.submit.type == "id"){
var result = await driver.findElement(By.id(formOpts.submit.value)).click();
}
return result;
}
async function clearFieldByXpath(driver, path){
await driver.findElement(By.xpath(path)).clear();
return;
}
async function clickById(driver, id){
await driver.sleep(1000)
let el = await driver.wait(until.elementLocated(By.id(id), 3000));
await driver.sleep(1000)
await el.click()
return el;
}
async function clickByXpath(driver, path){
await driver.sleep(1000)
await driver.findElement(By.xpath(path)).click();
await driver.sleep(1000)
return;
}
function getOptions(dd){
let options = new firefox.Options();
options.addArguments('--headless')
options.addArguments('download.default_directory',dd)
options.setPreference('devtools.console.stdout.content', true)
options.setPreference("browser.download.folderList",2);
options.setPreference('browser.download.dir',dd)
options.setPreference('browser.download.useDownloadDir',true)
options.setPreference('browser.download.manager.showWhenStarting',false)
options.setPreference('browser.helperApps.alwaysAsk.force', false)
options.setPreference('browser.helperApps.neverAsk.saveToDisk','application/vnd.ms-excel, application/octet-stream') // the response header for the file contains: content-type: application/vnd.ms-excel
'application/pdf,image/jpeg,image/jpg,text/calendar,text/csv')
return options;
}
function getProfile(){
let profile = new FirefoxProfile()
profile.setPreference("webdriver.log.file", "/opt/intr/dev-server/assets/firefox_console") // 777 permissions
profile.setPreference("webdriver.firefox.logfile", "/opt/intr/dev-server/assets/firefox_browser") // 777 permissions
profile.setPreference('browser.download.dir','/opt/intr/dev-server/assets/') // 777 permissions
profile.setPreference('browser.helperApps.alwaysAsk.force', false)
profile.setPreference('browser.helperApps.neverAsk.saveToDisk','application/vnd.ms-excel, application/octet-stream') // the response header for the file contains: content-type: application/vnd.ms-excel
return profile;
}
async function getDriver(dd, cb){
let options = getOptions(dd);
let profile = getProfile();
let capabilities = webdriver.Capabilities.firefox();
profile.encoded(async function(err, encodedProfile) {
capabilities.set("firefox_profile", encodedProfile) // this won't carry on to the driver. When getting .getCapabilities() there is no parameter in the Map with name "firefox_profile"
const driver = await new Builder()
.forBrowser('firefox')
.withCapabilities(capabilities)
.setFirefoxOptions(options)
.build();
cb(driver)
});
}
async function getElementById(driver, id){
await driver.sleep(1000)
let elements = await driver.findElement(By.id(id))
await driver.sleep(1000)
return elements;
}
async function getElementByXpath(driver, path){
await driver.sleep(1000)
let elements = await driver.findElement(By.xpath(path))
await driver.sleep(1000)
return elements;
}
async function setFieldByXpath(driver, path, value){
await driver.sleep(1000)
await driver.findElement(By.xpath(path)).sendKeys(value)
return
}
async function waitById(driver, id){
let present = await driver.wait(until.elementLocated(By.id(id), 3000));
return present
}
module.exports = { clickById, clearFieldByXpath, clickByXpath, getDriver, getElementById, getElementByXpath, loginWithForm, setFieldByXpath, waitById}
这是另一个文件中的测试本身:
async openFeedback(fromDate, to){
this.driver.manage().window().maximize()
await webscraper.clickById(this.driver, 'menu__food-dropdown');
await webscraper.clickById(this.driver, 'menu__feedback-feedback');
await this.driver.sleep(1000)
await webscraper.clickById(this.driver, "gwt-uid-14")
await webscraper.clearFieldByXpath(this.driver, "//div[@class='v-slot v-align-middle'][1]/div/input")
await webscraper.setFieldByXpath(this.driver, "//div[@class='v-slot v-align-middle'][1]/div/input", '21.4.2023');
await this.driver.sleep(1000)
let downloader = await webscraper.getElementByXpath(this.driver, "//div[@class='v-horizontallayout v-layout v-horizontal v-widget jamixbuttons v-horizontallayout-jamixbuttons smallmargin v-horizontallayout-smallmargin wrapping v-horizontallayout-wrapping menustyle v-horizontallayout-menustyle']/div[7]/div")
await downloader.sendKeys(Key.ENTER)
await this.driver.sleep(10000)
this.driver.quit()
return
}
这会初始化驱动程序:
static async initialize(url, cb){
webscraper.getDriver('/opt/intr/dev-server/assets/reports', (driver)=>{
cb(new Jamix(driver, url)); // the directory permissions are for now set to 777
});
}
这开始了整个测试:
await Jamix.Jamix.initialize("https://someurl", async (jamix)=>{
await jamix.login({"username":"j_username","password":"j_password","submit":{"type":"id","value":"button-login"}},{"username":"xxxxxxx","password":"xxxxxxx"}) // Login works
await jamix.openFeedback('21.4.2023','21.4.2023');
});
我定义的功能应该是这样的:
Capabilities {
map_: Map(3) {
'browserName' => 'firefox',
'moz:debuggerAddress' => true,
'firefox_profile' => 'UEsDBBQAAAgIAMV7mVb82VSjMAMAAHoLAAAHAAAAdXNlci5qc5VWPW/bMBDd+ysCTy0Q0WmCLO2UJh0KFMiQBh0JijpZjCiSII+S/e97lBTUji3J3vTx3h15fPeOMYDnzkP5eSWcY9EVAoGJiHZ1fVUKHeDL90/xJAiMyDUUp3G5tx29scJ2RltRsEYYsaEPobLd3wrMCwqPymzm6T9ffz8w24L3qgCCoo9zyDsmpASH/aqmsVqZmlkHhsMWwRuhCX67hDXQdcrQhqbBtiwJD/N7CqKE/pl2f14RAwgvq7Hup6FpIyYoawLLtZW1VgHPDR56HloPzEOIDfDS24ZLL0K1wK1AayYrkPUTlCJq/DH8maehyAPrhDfP5lHbsFCvPfQzncPCipKsomOOxEbImzOOoBGaoi/o+T1uZRtIsXkHWtIzjz6JZyVyG/FbroWpV4fMAlq0VgdGIrZeUqWt3k92LNPCNqxQIQF4r7wielooT320ePqpdZ8G8oskdiDG15tJuLabzaEOj9ezBz+n9Y/hxqIqd6+TujCAnfX16BHZ2EUZ1RxjmKdUiI5424wKa0BiSps58BlB2z7fx80fMF2lQrXL0m8nQsg0mA0m0d/e3x/S3hdFBkhF1tp2PN/xYlD9ybI5aiKHIemXN7YQekFhIOmYccdKpYGemPWKjoY7q5XcEeduAR/QK4n8I20uVeoqDoY8MOmr/zzRjLOU3tS5NfIycgeivphwWS4Nor1sa4eMy7KFmDcKuTLnp2sVdCldo7aLwjgmLC5PbYw15OoNNDn4l/51oqOSSdUK2dgf7/N6NKKTCn+nIGjKgH43r/Bj+NAiPf52Cevhjfp7wqLeRCuC9MohzereBPrS/DKPg9/OXgeS3w6TnRWxcbNe2EFeeEXOwoebBo+GQIHWxSV4DAukITQ3AumVQ0vSXqKQLaWR/D+Pog+9s52eHGSGfCgF99FwVE3a/d3NRPw0AXoLSVNsTcVbK8q0pqk1WuiaFgAY1qUiot3ycYKtpuKNuBT3krDjYaymjmi8RhbKL0WcCEFXFZoLD4N9d2IXHkLNSprIC9ePPZ6hA/OJFkQLf9KYrfvZ7xx5rUiyW7eGrrohg60EfX21/8eSeJFmmgfRpCX+A1BLAQIUAxQAAAgIAMV7mVb82VSjMAMAAHoLAAAHAAAAAAAAAAAAAACkgQAAAAB1c2VyLmpzUEsFBgAAAAABAAEANQAAAFUDAAAAAA=='
}
}
这是我从 .getCapabilities 中得到的:
Capabilities {
map_: Map(22) {
'acceptInsecureCerts' => false,
'browserName' => 'firefox',
'browserVersion' => '112.0.1',
'moz:accessibilityChecks' => false,
'moz:buildID' => '20230414190624',
'moz:debuggerAddress' => '127.0.0.1:9222',
'moz:geckodriverVersion' => '0.32.2',
'moz:headless' => true,
'moz:platformVersion' => '5.15.0-69-generic',
'moz:processID' => 647038,
'moz:profile' => '/tmp/rust_mozprofileB7PKSi',
'moz:shutdownTimeout' => 60000,
'moz:useNonSpecCompliantPointerOrigin' => false,
'moz:webdriverClick' => true,
'moz:windowless' => false,
'pageLoadStrategy' => 'normal',
'platformName' => 'linux',
'proxy' => {},
'setWindowRect' => true,
'strictFileInteractability' => false,
'timeouts' => { implicit: 0, pageLoad: 300000, script: 30000 },
'unhandledPromptBehavior' => 'dismiss and notify'
}
}
回答如下:
更多推荐
Selenium:在 firefox 驱动程序中下载未启动
发布评论