如何隐藏Chrome Web驱动程序图标(Python-Selenium)

时间:2017-07-20 20:42:51

标签: python-3.x google-chrome selenium selenium-chromedriver chrome-options

推理更新

目标:在后台中运行chrome web驱动程序,而不在Dock或应用栏中显示应用图标。仅供参考:我已经可以运行chrome headless,但我无法隐藏或不在我的应用栏中显示chrome图标。

原因:我正在构建一个并行访问各种网站的应用程序,我不希望为正在进行的同步任务显示chrome应用程序图标。我想在后台运行这些任务。

带有Chrome选项的当前代码,将显示无头铬

__declspec( dllexport ) void* setup(int c_force, int c_stepping, int c_iteration, int c_roots,
                                    struct para* c_userdata, double* c_y0,
                                    double c_reltol, double c_abstol)
{
    int flag;
    N_Vector y;
    void* cvode_mem;
    PARA* ptr_para;
    ptr_para = c_userdata;

    // ****** Set up vector with initial conditions ******
    y = N_VNew_Serial(2);
    NV_Ith_S(y,0) = c_y0[0];
    NV_Ith_S(y,1) = c_y0[1];

    // ****** Create cvode object with stepping and iteration method ******
    if(c_iteration==CV_FUNCTIONAL)
        cvode_mem = CVodeCreate(c_stepping, 1);    // Functional iteration
    else
        cvode_mem = CVodeCreate(c_stepping, 2);    // Newton interation
    if(check_flag((void *)cvode_mem, "CVodeCreate", 0)) return(NULL);

    flag = CVodeInit(cvode_mem, ode, 0, y);

    if(check_flag(&flag, "CVodeInit", 1)) return(NULL);

    // ****** Specify integration tolerances ******
    flag = CVodeSStolerances(cvode_mem, c_reltol, c_abstol);
    if(check_flag(&flag, "CVodeSStolerances", 1)) return(NULL);

    // ****** Set up linear solver module if required ******
    if(c_iteration==CV_DENSE_USER)
    {
        printf("Dense user supplied Jacobian\n");
        // Dense user-supplied Jacobian
        flag = CVDense(cvode_mem, 2);
        if(check_flag(&flag, "CVDense", 1)) return(NULL);

        flag = CVDlsSetDenseJacFn(cvode_mem, jac);

        if(check_flag(&flag, "CVDlsSetDenseJacFn", 1)) return(NULL);
    }
    else if(c_iteration==CV_DENSE_DQ)
    {
        // Dense difference quotient Jacobian
        flag = CVDlsSetDenseJacFn(cvode_mem, NULL);
        if(check_flag(&flag, "CVDlsSetDenseJacFn", 1)) return(NULL);
    }


    // Set optional inputs
    flag = CVodeSetUserData(cvode_mem, c_userdata);
    if(check_flag(&flag, "CVodeSetUserData", 1)) return(NULL);

    // Attach linear solver module

    // Specify rootfinding problem
    if(c_roots!=ROOTS_OFF)
    {
         flag = CVodeRootInit(cvode_mem, 1, root_func);
    }

    return cvode_mem;
}

研究

Chrome选项列表:https://peter.sh/experiments/chromium-command-line-switches/

许多帖子中的一篇解释了如何做无头铬:Selenium - chrome Driver fail to start in background (without a start-up window)

如何隐藏chromedriver app图标?我是否可以设置镀铬选项,除了设置无头' chrome选项?这是一个需要在后台运行chromedriver的操作系统设置吗?我能够成功地在无头模式下运行多个chromedrivers,但是不要在Dock或应用程序托盘中显示chrome图标,类似于phantomjs不会启动应用程序图标。

enter image description here

^在上面的图片中,那些是在无头模式下运行的chromedrivers在我的Dock中显示,理想情况下我的程序我甚至不想显示这些图标,因为它无论如何都是后台处理。

2 个答案:

答案 0 :(得分:1)

更新(这对我来说至少在我的Mac上隐藏了chromedriver图标):

我无法找到Chrome Option来隐藏出现在停靠栏中的chromedriver图标。但是,我能够编辑Chrome的Info.plist文件,作为我的程序的一部分,以便使用LSBackgroundOnly密钥来隐藏chromedriver图标。

在Chrome的Info.plist中,我以编程方式输入了:

<key>LSBackgroundOnly</key>
<string>1</string>

在我的Mac上使用python3代码我使用os.system执行终端命令,使用defaults在程序执行时输入LSBackgroundOnly key,然后在程序执行结束时删除来自Info.plist的LSBackgroundOnly key

喜欢这个

1)

defaults write /Applications/Google\ Chrome.app/Contents/Info.plist LSBackgroundOnly -string '1'

2)

defaults delete /Applications/Google\ Chrome.app/Contents/Info.plist LSBackgroundOnly

AS INFO:这很棘手,因为如果在程序执行期间没有正确添加/删除LSBackgroundOn,您的普通Chrome应用可能会以后台模式启动。根据我的经验,在最糟糕的情况下,您可能需要从Info.plist文件中手动删除LSBackgroundOnly,然后重新启动计算机以使Chrome退出后台模式。

我在程序执行后从程序中的Info.plist文件中删除了LSBackgroundOnly键,因为只有在启动chromedrivers时才需要将键放在文件中。之后,我希望能够使用常规Chrome应用,而不会在后台模式下打开它。但是,如果您了解程序执行并处理异常,这肯定会正确隐藏图标,并且使用常规Chrome应用程序没有任何不同。

快乐的黑客攻击。

答案 1 :(得分:0)

使用Selenium无法做到这一点。我真的不明白你为什么要这样做。是否有真正的目的,或者只是你不希望它展示?即使Chrome应用在Dock上显示,在无头模式下也能正常运行。

但是,如果您希望打开时图标不会出现在Dock中,则需要通过修改该应用程序的Info.plist文件来禁用它。

在您的Info.plist Chrome浏览器中,添加此

 <key>LSUIElement</key>
 <true/>

这可以防止您的应用图标在工作时出现在停靠栏中。我很久以前就发现了这一点,this就是我看到它的帖子。

PS - 我还没有为Chrome应用测试它。请自担风险。