Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2015, 20:28   #1
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию Авторизация на сайте используя Awesomium

Доброго времени суток. Не могу понять как сделать так, чтобы при нажатий на кнопку формы поля формы на сайте заполнялись последовательно (с небольшой задержкой) . Мне удается все по отдельности реализовать, но чтобы все заработало вместе мне нужно как то делать задержку. Обычная пауза основного потока Thread.Sleep() не помогает. Решил спросить способ решения у форума. Буду благодарен примеру или ссылке. Спасибо!
Код:

       private void auth_Click(object sender, RoutedEventArgs e)
        {
            /*
            string xpathLoginButton = ".//*[@class='formFooterButtons']/button";
            string xpathloginInpit = ".//*[@class='loginUsername']/input";
            string xpathpasswordInput = ".//*[@class='loginPassword']/input";
            string xpathallinput = "html/body/div[1]/div[1]/div[1]/div/div/div/form/ul/li/input";
 
            // dynamic loginButton = (JSObject)webControl.ExecuteJavascriptWithResult(String.Format("document.evaluate("{0}", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);", xpathLoginButton));        
            dynamic loginInpit = (JSObject)webControl.ExecuteJavascriptWithResult(String.Format("document.evaluate("{0}", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);", xpathloginInpit));
            dynamic passwordInpit = (JSObject)webControl.ExecuteJavascriptWithResult(String.Format("document.evaluate("{0}", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);", xpathpasswordInput));
 
            dynamic allInput = (JSObject)webControl.ExecuteJavascriptWithResult(String.Format("document.evaluate("{0}", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);", xpathallinput));
 
            allInput.snapshotItem(0).value = "maasdasd@asdasd.ru";
            allInput.snapshotItem(1).value = "123132131";
 
            dynamic loginButton = (JSObject)webControl.ExecuteJavascriptWithResult(String.Format("document.evaluate("{0}", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);", xpathLoginButton));
            using (loginButton)
                loginButton.InvokeAsync("click");
             * */
 
            //Шаг первый нажимаем кнопку "Вход"
            string inputJsXpath = GetJsSingleXpathString("html/body/div[1]/div[1]/div/div[1]/div/button[2]");
 
            dynamic link = (JSObject)webControl.ExecuteJavascriptWithResult(inputJsXpath);
            if (link == null)
            {
                MessageBox.Show("No link found!");
                return;
            }
 
            // since <a> element doesn't have .click() etc. we must fire event instead. 
            // So in this case you even don't need the link object that we received above,
            // it was just to check if element exists on the page
            JsFireEvent(inputJsXpath, "click");
 
            Thread.Sleep(5000);
 
            // Шаг второй заполянем поля формы
            string inputLoginJsXpath = GetJsSingleXpathString(".//*[@id='userEmail']");
 
            dynamic loginInput = (JSObject)webControl.ExecuteJavascriptWithResult(inputLoginJsXpath);
            if (loginInput == null)
            {
                MessageBox.Show("No link found!");
                return;
            }
            loginInput.snapshotItem(1).value = "фвфыв@фывфыв.ru";
 
        }
 
        public static string GetJsSingleXpathString(string xpath)
        {
            return
                String.Format(
                    "document.evaluate("{0}", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue", xpath);
        }
 
        // executes javascript which fires specified event on element 
        // Example: JsFireEvent("document.getElementById('my_id')", "click");
        public void JsFireEvent(string getElementQuery, string eventName)
        {
            webControl.ExecuteJavascript(@"
                 function fireEvent(element,event) {
                     var evt = document.createEvent('HTMLEvents');
                     evt.initEvent(event, true, true ); // event type,bubbling,cancelable
                     element.dispatchEvent(evt);
                 }
                 " + String.Format("fireEvent({0}, '{1}');", getElementQuery, eventName));
        }
Notan1310 вне форума Ответить с цитированием
Старый 04.11.2015, 20:49   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чем Thread.Sleep-то не помогает? Должно работать. Может быть вам задержка нужна не между заполнениями полей, а между чем-то другим. Или вообще заполнение не работает (не активирует нужные события).

Вообще Awesomium не лучший вариант для автоматизации (+ там старая версия Хромиума), он для HTML UI предназначен.

Для автоматизации есть Selenium.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.11.2015, 21:59   #3
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию

Selenium мне очень нравится, но как его можно встроить в окно приложения. Точнее возможно ли?
Notan1310 вне форума Ответить с цитированием
Старый 04.11.2015, 22:33   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вряд ли можно, ну или не просто (создать веббраузер на форме и каким-то образом указать Селениуму, что надо использовать его).

Просто обычно это не требуется для таких задач, чаще даже наоборот удобнее браузер вообще без рендеринга (PhantomJS), особенно когда несколько одновременно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.11.2015, 00:09   #5
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию

Alex11223 благодарю. Прояснили ситуацию. Дело в том что я встречал в сообщениях некоторых людей, что они используют awesomium и по идее красиво получается, но функциональность не такая высокая как у selenium webdriver. Еще раз благодарю за сэкономленное время.

P.S Не могу в репутацию плюс добавить из-за правил форума. В предпоследний раз вы тоже мне хороший совет дали.
Notan1310 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авторизация на сайте Shahin87 PHP 26 27.03.2014 20:59
Авторизация на сайте sanco Работа с сетью в Delphi 3 17.03.2013 21:40
Авторизация на сайте Alex2009 Работа с сетью в Delphi 8 30.12.2011 19:12
Авторизация на сайте KpacaB4uk Работа с сетью в Delphi 5 18.02.2011 10:11
Авторизация на сайте Abadd0N Работа с сетью в Delphi 14 10.06.2009 12:31