最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Selenium:在 firefox 驱动程序中下载未启动

网站源码admin32浏览0评论

Selenium:在 firefox 驱动程序中下载未启动

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'
  }
}
回答如下:
发布评论

评论列表(0)

  1. 暂无评论