且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C#使用当前个人资料/会话填写Web表单/草稿网页

更新时间:2023-02-15 15:32:23

我回来了,我找到了解决方案! (感谢此)

I'm back and I FOUND THE SOLUTION! (thanks to this guy)

使用以下代码,您可以创建新的配置文件并重新使用它们.如果您使用所需的帐户(例如您的Google帐户)登录一次,它将保持同步!因此,无论您将其用于什么用途,它都很棒.

With the below code you can create NEW PROFILES and reuse them. If you will log in once with the desired accounts (for example your google account), it will remain synchronized! So it's awesome for whatever you need to use it for.

要求:Selenium.WebDriver(NuGet)+ chromedriver_win32(与您的chrome版本兼容的版本-手动下载)+在代码中编辑"default_profile_dir"和"chromedriver_path" C#Web表单,下面的所有代码:

Requirements: Selenium.WebDriver (NuGet) + chromedriver_win32 (version compatible for your chrome version-manually download) + edit in code the "default_profile_dir" and the "chromedriver_path" C# web forms, all code below:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Internal;
using OpenQA.Selenium.Remote;
using System.IO;
using System.Drawing.Imaging;
using System.Management;
using System.Text.RegularExpressions;
using System.Threading;
using System.Diagnostics;
using System.Reflection;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using System.Net;

namespace ChromeAssistant
{
    public partial class form_main_chromeassistant : Form
    {
        public form_main_chromeassistant()
        {
            InitializeComponent();
        }

        private void btn_test_profile_Click(object sender, EventArgs e)
        {
            CoreDriver CD = new CoreDriver();

            //Config
            CD.my_port = 50150;
            CD.my_name = "ChromeAssistant";
            CD.ConfigureProfile();
            CD.Initialize();

            CD.driver.Navigate().GoToUrl("https://www.google.ro/");
        }
    }

    #region CoreDriver
    public class CoreDriver
    {
        public IWebDriver driver;
        public string my_name { get; set; }
        public int my_port { get; set; }

        public string default_profile_dir = @"C:\Users\john\AppData\Local\Google\Chrome\";
        public string chromedriver_path = @"C:\Users\john\.nuget\packages\chromedriver_win32\";
        public string site_profile_path;
        public string site_profile_path_s;
        public string default_path;

        public void Initialize()
        {
            ChromeOptions options = new ChromeOptions();
            options.AddArgument("--log-level=3");
            options.AddArgument("--test-type");
            options.AddArgument("--silent");
            options.AddArgument("user-data-dir=" + site_profile_path_s);
            options.AddArgument("--disable-plugins"); // disable flash

            var driverService = ChromeDriverService.CreateDefaultService(chromedriver_path);
            driverService.HideCommandPromptWindow = true;
            driverService.Port = my_port;

            driver = new ChromeDriver(driverService, options);

            //The 2 line were commented by me because I got 2 errors for them
            //driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 14));
            //driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(15));
            //This was added by me to replace the 2 commented lines
            driver.Manage().Timeouts().ImplicitWait = new TimeSpan(0, 0, 15);

            IJavaScriptExecutor jscript = driver as IJavaScriptExecutor;
            jscript.ExecuteScript("return window.stop");
        }

        public void ConfigureProfile()
        {
            site_profile_path_s = default_profile_dir + "profile " + my_name;
            site_profile_path = site_profile_path_s + @"\Default";

            default_path = default_profile_dir + @"User Data\Default";

            if (!Directory.Exists(site_profile_path))
            {
                CreateBlankProfile();
            }
            else
            {
                // copy existing chrome profile. Keep cache, extensions, etc.
                CopyProfileFiles();

                // but stay away from opened tabs
                RemoveOpenedTabsFiles();
            }

        }

        public void CleanUpOldProfiles()
        {
            DirectoryInfo di = new DirectoryInfo(default_profile_dir);
            DirectoryInfo[] directories = di.GetDirectories("profile*", SearchOption.TopDirectoryOnly);
            if (directories.Count() > 0)
            {
                foreach (var folder in directories)
                {
                    try
                    {
                        Directory.Delete(folder.FullName, true);
                    }
                    catch
                    {

                    }

                }

            }
        }

        public void CreateBlankProfile()
        {
            // new profile direftory
            CreateIfMissing();

            // copy existing chrome profile. Keep cache, extensions, etc.
            // but stay away from opened tabs
            CopyProfileFiles();
            CopyProfileFolders();
        }

        public void CopyProfileFiles()
        {
            // default profile location
            DirectoryInfo di = new DirectoryInfo(default_path);

            // copy files
            List<string> file_lib = new List<string>() { "Cookies", "Login", "Preferences", "Secur" };
            FileInfo[] files = di.GetFiles("*", SearchOption.TopDirectoryOnly);
            if (files.Count() > 0)
            {
                foreach (var file in files)
                {
                    if (PassFileOrFolder(file.Name, file_lib))
                    {
                        file.CopyTo(site_profile_path + @"\" + file.Name, true);
                    }

                }

            }
        }

        public void RemoveOpenedTabsFiles()
        {
            // default profile location
            DirectoryInfo di = new DirectoryInfo(site_profile_path);

            // copy files
            List<string> file_lib = new List<string>() { "Current", "Last" };
            FileInfo[] files = di.GetFiles("*", SearchOption.TopDirectoryOnly);
            if (files.Count() > 0)
            {
                foreach (var file in files)
                {
                    if (PassFileOrFolder(file.Name, file_lib))
                    {
                        File.Delete(file.FullName);
                    }

                }

            }
        }

        public void CopyProfileFolders()
        {
            // default profile location
            DirectoryInfo di = new DirectoryInfo(default_path);

            // copy folders
            List<string> folder_lib = new List<string>() { "databases", "Extension", " Storage", "Web Applications", "File System", "IndexedDB" };
            DirectoryInfo[] directories = di.GetDirectories("*", SearchOption.TopDirectoryOnly);
            if (directories.Count() > 0)
            {
                foreach (var folder in directories)
                {
                    if (PassFileOrFolder(folder.Name, folder_lib))
                    {
                        DirectoryCopy(folder.FullName, site_profile_path + @"\" + folder.Name, true);
                    }

                }

            }
        }

        private void CreateIfMissing()
        {
            Directory.CreateDirectory(site_profile_path);
        }

        private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
        {
            // Get the subdirectories for the specified directory.
            DirectoryInfo dir = new DirectoryInfo(sourceDirName);
            DirectoryInfo[] dirs = dir.GetDirectories();

            if (!dir.Exists)
            {
                throw new DirectoryNotFoundException(
                    "Source directory does not exist or could not be found: "
                    + sourceDirName);
            }

            // If the destination directory doesn't exist, create it. 
            if (!Directory.Exists(destDirName))
            {
                Directory.CreateDirectory(destDirName);
            }

            // Get the files in the directory and copy them to the new location.
            FileInfo[] files = dir.GetFiles();
            foreach (FileInfo file in files)
            {
                string temppath = Path.Combine(destDirName, file.Name);
                file.CopyTo(temppath, false);
            }

            // If copying subdirectories, copy them and their contents to new location. 
            if (copySubDirs)
            {
                foreach (DirectoryInfo subdir in dirs)
                {
                    string temppath = Path.Combine(destDirName, subdir.Name);
                    DirectoryCopy(subdir.FullName, temppath, copySubDirs);
                }
            }
        }

        public bool PassFileOrFolder(string input, List<string> library)
        {
            foreach (string name in library)
            {
                if (input.Contains(name))
                {
                    return true;
                }
            }
            return false;
        }
    }
    #endregion
}