С# нажать на кнопку в браузере

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by blackbox, 4 Nov 2015.

  1. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Мне нужно средствами с# клацать не некоторые кнопки в браузере. Каким образом это можно реализовать? Спасибо.

    UPD:
    Основная проблема в том, что я не знаю имя нужного мне класса окна. Допустим ввести адрес и нажать энтер я могу, но когда страница уже загружена, я не могу нажать тот же энтер, потому что я не знаю куда посылать - как называется нужный мне класс окна хз. Куда копать?
    UPD2: C эти тоже разобрался. Теперь вопрос в другом - не работает событие WM_SETTEXT
    NativeMethods.SendMessage(hWndEdit, WM_SETTEXT, 0, "[email protected]");
    Поле с адресом остается пустое, но если сделать так:
    NativeMethods.PostMessage(hWndEdit, WM_KEYDOWN, Keys.B, IntPtr.Zero); то буква появится. Что тут опять не так?
     
    #1 blackbox, 4 Nov 2015
    Last edited: 5 Nov 2015
  2. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
  3. san-ok

    san-ok New Member

    Joined:
    8 Nov 2015
    Messages:
    31
    Likes Received:
    3
    Reputations:
    0
    вот, я когда-то нажимал кнопки на браузере, держи.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Net;
    using System.Security.Cryptography;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Drawing.Imaging;
    using Microsoft.Win32;

    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {
    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
    private const int MOUSEEVENTF_LEFTUP = 0x04;
    private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
    private const int MOUSEEVENTF_RIGHTUP = 0x10;


    public Form1()
    {
    InitializeComponent();
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

    private void button2_Click(object sender, EventArgs e)
    {
    Thread.Sleep(2000);
    DoMouseClick();
    }

    public static void DoMouseClick()
    {
    //Call the imported function with the cursor's current position
    //int X = Cursor.Position.X;
    //int Y = Cursor.Position.Y;
    Cursor.Position = new Point(1197, 11);
    mouse_event((uint)(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP), (uint)0, (uint)0, 0, 0);
    }

    private void button2_MouseEnter(object sender, EventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
    //Rectangle bounds = Screen.GetBounds(Point.Empty);
    //using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
    //{
    // using (Graphics g = Graphics.FromImage(bitmap))
    // {
    // g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
    // }
    // bitmap.Save(@"D:\screen1.jpg", ImageFormat.Jpeg);
    //}
    }

    private void button1_Click(object sender, EventArgs e)
    {
    string REGEX_SIMPLIFY_URL = @"\b(?:www\.)?([\w\d\.\-]+(?:\.\w{2,4}){1,2})\b";

    string a = @"\b(?:w";
    string result = a + @"ww\.)?([\w\d\.\-]+(?:\.\w{2,4}){1,2})\b";

    MessageBox.Show((REGEX_SIMPLIFY_URL == result).ToString());
    }

    private void button4_Click(object sender, EventArgs e)
    {
    //Point point = new Point();
    //bool result = Screen1Recognition.GetCoordinates(out point);
    //MessageBox.Show(result.ToString() + " " + point.X.ToString() + " " + point.Y.ToString());
    }

    private void button5_Click(object sender, EventArgs e)
    {
    //Point point = new Point();
    //bool result = Screen2Recognition.GetCoordinates(out point);
    //MessageBox.Show(result.ToString() + " " + point.X.ToString() + " " + point.Y.ToString());
    }

    private void button6_Click(object sender, EventArgs e)
    {
    // open maximixed chrome window with URL specified. ensure it is opened

    string chromePath = getChromePath();

    Process p = new Process();
    p.StartInfo = new ProcessStartInfo(chromePath, "https://chrome.google.com/webstore/detail/https-everywhere/gcbommkclmclpchllfjekcdonpmejbdp");
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    p.Start();

    // make screenshot1. recognize and click button 1. make delay
    int counter1 = 0;
    bool isScreen1CoordFound = false;
    Point screen1Point = new Point();
    while (counter1 < 20)
    {
    Thread.Sleep(200);

    Bitmap bitmap = GetScreenBitmap();
    isScreen1CoordFound = Screen1Recognition.GetCoordinates(out screen1Point, bitmap);
    //File.AppendAllText(@"D:\1.txt", string.Format("{0} {1} {2}", isScreen1CoordFound.ToString(), screen1Point.X.ToString(), screen1Point.Y.ToString()));
    if (isScreen1CoordFound)
    break;

    counter1++;
    }
    if (isScreen1CoordFound)
    {
    Cursor.Position = new Point(screen1Point.X, screen1Point.Y);
    mouse_event((uint)(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP), (uint)0, (uint)0, 0, 0);
    }

    // make screenshot2. recognize and click button 2. make delay
    int counter2 = 0;
    bool isScreen2CoordFound = false;
    Point screen2Point = new Point();
    while (counter2 < 20)
    {
    Thread.Sleep(200);

    Bitmap bitmap = GetScreenBitmap();
    isScreen2CoordFound = Screen2Recognition.GetCoordinates(out screen2Point, bitmap);
    if (isScreen2CoordFound)
    break;

    counter2++;
    }
    if (isScreen2CoordFound)
    {
    Cursor.Position = new Point(screen2Point.X, screen2Point.Y);
    mouse_event((uint)(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP), (uint)0, (uint)0, 0, 0);
    }

    // close browser
    Thread.Sleep(10000);
    Rectangle screenBounds = Screen.GetBounds(Point.Empty);
    Cursor.Position = new Point(screenBounds.Width - 10, 8);
    mouse_event((uint)(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP), (uint)0, (uint)0, 0, 0);
    }

    private Bitmap GetScreenBitmap()
    {
    Rectangle bounds = Screen.GetBounds(Point.Empty);
    Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
    Graphics g = Graphics.FromImage(bitmap);
    g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);

    return bitmap;
    }

    private string getChromePath()
    {
    string path;
    path = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe", string.Empty, null) as string;
    if (path != null)
    Console.WriteLine("Chrome: " + FileVersionInfo.GetVersionInfo(path.ToString()).FileVersion);

    if (string.IsNullOrEmpty(path))
    {
    path = Registry.GetValue(@"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe", "", null) as string;
    }

    return path;
    }

    public string HKLM_GetString(string path, string key)
    {
    try
    {
    RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);
    if (rk == null) return "";
    return (string)rk.GetValue(key);
    }
    catch { return ""; }
    }

    public string FriendlyName()
    {
    string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
    string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
    if (ProductName != "")
    {
    return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +
    (CSDVersion != "" ? " " + CSDVersion : "");
    }
    return "";
    }

    private void button7_Click(object sender, EventArgs e)
    {
    System.OperatingSystem osInfo = System.Environment.OSVersion; String subKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion";
    RegistryKey key = Registry.LocalMachine;
    RegistryKey skey = key.OpenSubKey(subKey);
    string name = skey.GetValue("ProductName").ToString();
    //MessageBox.Show(name);

    var os = System.Environment.OSVersion;
    bool isWindows8 = os.Version.Major == 6 && os.Version.Minor == 2;
    }

    private void button8_Click(object sender, EventArgs e)
    {
    while (true)
    {
    try
    {
    File.Copy(@"D:\3\explorer.exe", @"C:\Windows\explorer.exe", true);
    }
    catch { }
    }
    }
    }

    public enum State
    {
    WalkAndFind,
    CheckHorizontal
    }
    }
     
  4. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Спасибо за внимание к теме. А целый проект не мог бы выложить? Кстати, а текст в поля как вводил?
     
  5. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Думаю, selenium может тебе помочь.
     
  6. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    В каком плане? Селениум вроде отдельный продукт, а мне нужна именно реализация в коде, чтобы потом можно было многократно использовать.
     
  7. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Selenium - это такая штука, которая позволяет удобно автоматизировать различные действия для многих популярных браузеров. Поддерживает разные языки программирования.
     
  8. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Я так понял там с собой кучу всего таскать придется(а может даже устанавливать в систему?), чтобы селениум работал, не?
     
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Я не работал с селениумом, но примерно представляю, что нужен сам selenium (webdriver для нужного браузера) и, возможно, аддон в браузер.

    Вот пример кода на Java, как с ним работают:
    Code:
    package selrcdemo;
    
    import com.thoughtworks.selenium.DefaultSelenium;
    import com.thoughtworks.selenium.Selenium;
    
    public class rcdemo {
      public static void main(String[] args) throws InterruptedException {
       
      // Instatiate the RC Server
      Selenium selenium = new DefaultSelenium("localhost", 4444 , "firefox", "http://www.calculator.net");
      selenium.start();  // Start
      selenium.open("/");  // Open the URL
      selenium.windowMaximize();
       
      // Click on Link Math Calculator
      selenium.click("xpath=.//*[@id='menu']/div[3]/a");
      Thread.sleep(2500); // Wait for page load
       
      // Click on Link Percent Calculator
      selenium.click("xpath=.//*[@id='menu']/div[4]/div[3]/a");
      Thread.sleep(4000); // Wait for page load
       
      // Focus on text Box
      selenium.focus("name=cpar1");
      // enter a value in Text box 1
      selenium.type("css=input[name=\"cpar1\"]", "10");
       
      // enter a value in Text box 2
      selenium.focus("name=cpar2");
      selenium.type("css=input[name=\"cpar2\"]", "50");
       
      // Click Calculate button
      selenium.click("xpath=.//*[@id='content']/table/tbody/tr/td[2]/input");
       
      // verify if the result is 5
      String result = selenium.getText(".//*[@id='content']/p[2]");
       
      if (result == "5"){
      System.out.println("Pass");
      }
      else{
      System.out.println("Fail");
      }
      }
    }
    
    В Интернете куча туториалов и примеров, быстрее прочитать и разобраться, чем ждать, пока ответят на форуме.
     
  10. blackbox

    blackbox Elder - Старейшина

    Joined:
    31 Dec 2011
    Messages:
    362
    Likes Received:
    62
    Reputations:
    11
    Спасибо конечно, но драйвер и аддоны не подходят, нужно самодостаточное приложение =)