1

我目前正在使用 Selenium Webdriver 和 Firefox(和 Firebug/NetExport 插件)来完成回归测试场景,其中从用户使用页面上的搜索栏后发送的 HTTP 请求中提取特定的查询字符串参数。调用完成后,NetExport 将请求中的 .HAR 文件保存到本地文件夹。实际上,它保存了 3 个文件(测试期间访问的每个页面一个),即使我有代码在最后一页加载之前直接捕获流量……但这是一个不同的问题。

但是,我需要更多地自动化它来执行以下操作:

1) 将捕获的 HAR 文件加载为可读格式 2) 找到所需的值 3) 记录该值以供稍后查看

我第一次尝试这样做是研究如何将 HAR 文件从本地文件夹拖放到在线 HAR 查看器。此特定页面有一个框,用于复制/粘贴 HAR 文件的内容,或将其拖放到文本框中以生成预览。我已经阅读了几个关于这个的不同问题(一些来自stackoverflow),并决定它要么是不可能的,要么会很复杂且不实用。

输入“showPreview”首选项。在几个不同的站点上,它是这样描述的:“显示预览: 显示导出数据的预览。默认使用 HAR 查看器。请参阅 extensions.firebug.ne ​​texport.viewerURL 首选项。

这给了我一个想法,即我可以让 NetExport 自动将 HAR 文件踢到在新选项卡中打开的查看器中……但我找不到任何关于如何发生这种情况的简化说明。一个支持页面给出了使用profile.setPreference("extensions.firebug.ne​​texport.viewerURL", " http://www.softwareishard.com/har/viewer1-1/ "); 但是,我已将该 URL 更新为指向最新的 URL,并加载了此首选项...但无论我做什么,我都无法预览 HAR 文件以显示在新的 Firefox 选项卡或其他任何地方那件事。

我没主意了。我对此很陌生,所以一些人就其他一些相关的问题给出的答案或提示超出了我的理解水平,而且似乎也不适合。

无论如何,这就是我到目前为止所拥有的。请忽略底部注释掉的东西 - 这只是我正在尝试的东西,并且想保留在那里以供我想再次修改它时参考。


package scn01pkg;

import java.io.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
import java.lang.InterruptedException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.firefox.internal.ProfilesIni;

import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

public class UsingBMP {
    public static void main(String[] args) {
    System.out.println(System.getProperty("user.dir"));

        // auto-install FireBug and NetExport into Firefox profile
        File firebug = new File("firebug-2.0.11-fx.xpi");
        File netExport = new File("netExport-0.9b7.xpi");

        FirefoxProfile profile = new FirefoxProfile();
        try {
            profile.addExtension(firebug);
            profile.addExtension(netExport);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Setting Firebug preferences
        profile.setPreference("extensions.firebug.currentVersion", "2.0.11");
        profile.setPreference("extensions.firebug.addonBarOpened", true);
        profile.setPreference("extensions.firebug.console.enableSites", true);
        profile.setPreference("extensions.firebug.script.enableSites", true);
        profile.setPreference("extensions.firebug.net.enableSites", true);
        profile.setPreference("extensions.firebug.previousPlacement", 1);
        profile.setPreference("extensions.firebug.allPagesActivation", "on");
        profile.setPreference("extensions.firebug.onByDefault", true);
        profile.setPreference("extensions.firebug.defaultPanelName", "net");

        // Setting netExport preferences
        profile.setPreference("extensions.firebug.netexport.alwaysEnableAutoExport", true);
        //  ---profile under this comment is a test---
        profile.setPreference("extensions.firebug.netexport.viewerURL", "http://www.softwareishard.com/har/viewer/");
        profile.setPreference("extensions.firebug.netexport.autoExportToFile", true);
        profile.setPreference("extensions.firebug.netexport.Automation", true);
        profile.setPreference("extensions.firebug.netexport.showPreview", true);
        profile.setPreference("extensions.firebug.netexport.defaultLogDir", "C:\\workspace\\CaptureNetworkTraffic");


        // Launch Firefox with the desired capabilities
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setBrowserName("firefox");
        capabilities.setPlatform(org.openqa.selenium.Platform.ANY);
        capabilities.setCapability(FirefoxDriver.PROFILE, profile);

        WebDriver driver = new FirefoxDriver(capabilities);

        // Wait until Firebug is loaded - 5s
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

        // Load tested website mainpage
        driver.get("http://www.website.com");

        // Wait for page to load (10s)
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // Clicking "Login" from the main page
        driver.findElement(By.cssSelector("#login-block a")).click();

        // Wait until tested website's login page is loaded - 10s
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        // Enter username
        driver.findElement(By.id("username")).sendKeys("myusername");

        // Waiting after entering in Username, 5s (increase if script failing persists)
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

        // Enter password
        driver.findElement(By.id("password")).sendKeys("mypassword");

        // Clicking "Sign in" after entering UN and PW
        driver.findElement(By.name("loginbutton")).click();

        // Waiting for page to load - implicitly wait 10s
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);    

        // Capture traffic
        try {
            //arbitrary wait time to avoid "issues"
            Thread.sleep(3000);

            //searching for product
            driver.findElement(By.id("parts")).sendKeys("searchterm");
            driver.findElement(By.cssSelector("#keyword-button-div button")).click();

            //Time to process request, print to file, and quit.
            Thread.sleep(6000);
            } catch(InterruptedException ie) {
            ie.printStackTrace();
            }

        //  ------Last bit commented out until proper use is determined--------

        // Extra wait time - uncomment out if needed
        //driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // Load the HAR viewer website
        //driver.get("http://www.softwareishard.com/har/viewer/");

        // Wait for page to load
        //driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        // Upload file to the online HAR viewer
        //WebElement inputField = driver.findElement(By.xpath("//*[@id=sourceEditor]"));
        //WebElement inputField = driver.findElement(By.id("sourceEditor"));
        //inputField.sendKeys("C:\\workspace\\CaptureNetworkTraffic\\www.freescale.com+2015-08-24+11-23-46.har");

        // Wait 2 seconds
        //driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);

        // Submit the data
        // driver.findElement(By.name("appendPreview")).click();

        // Wait for page to load
        // driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        // ---------uncomment out when script is working to this point--------------
        // driver.quit();


        }
}

提前感谢任何花时间阅读我的文字墙的人!

4

1 回答 1

1

由于缺乏任何额外的建议或支持,我设法通过冗长的“左转 3 次而不是右转 1 次”方法解决了我的问题:

1) 在我的代码中,打开在线 HAR 查看器。

2) 将 HAR 文件保存到文件夹并且无法更改默认名称或将导出限制为我想要的,我记下打开文件夹的默认像素位置和第三个 HAR 文件的默认像素位置名单。

2) 使用一个非常短的 AutoIt 脚本打开 HAR 导出存储文件夹,默认情况下,该文件夹会部分覆盖在线 HAR 查看器下拉框(可以手动放置文件),然后让脚本手动拖放第三个列表中的 HAR 文件到下拉框。

AutoIT 代码拖拽如下:

;~ --------------------------------------------------------------------------------------------
;~ ACTIONS - Open the folder location that contains the HAR files, then waits for Windows to process the action.
;~           Folder will open on top of the web page loaded before, which will leave the box area open
;~           to drag and drop the file
;~ --------------------------------------------------------------------------------------------

Run("C:\WINDOWS\EXPLORER.EXE /n,/e,C:\AutoIT\EXE\STORAGE\FOLDER")
Sleep(5000)

;~ --------------------------------------------------------------------------------------------
;~ ACTIONS - Go to pixel location of the THIRD HAR file in the list, then click and drag it to the pixel location
;~           located within the drop box area of the webpage
;~---------------------------------------------------------------------------------------------

MouseClickDrag("left", -716, 292, 280, 261)

AutoIt脚本必须编译成.exe,然后使用以下代码调用它

try {
  Runtime r = Runtime.getRuntime();
  Process p2 = r.exec("C:\\Default\\HAR\\STORAGE\\FOLDER\\LOCACTION\\MyAutoItScript.Exe");              
} catch(IOException ex) {
  System.out.println(ex.getMessage());
}

只要文件夹尚未打开并且任何以前导出的 HAR 文件都在存储文件夹中,它就会抓取正确的 HAR 文件并将其放入框中。我希望我能找到一个更好的解决方案,但在这一点上,我将采取极其漫长而艰难的方式,而不是根本没有解决方案!

于 2015-09-09T16:09:32.373 回答