Как очистить сайт с помощью ввода текста и нажать кнопку «Отправить» в .NET Core C # - PullRequest
0 голосов
/ 01 апреля 2019

Я очищаю сайт, который сделан в классическом asp.net.Имеет 2 поля с идентификатором.Один из них - вводимый текст, а другой - кнопка.Мне нужно заполнить поле ввода и нажать кнопку.А также получить ответ.Кнопка представляет собой тип отправки.

Я использовал HTML-пакет Agility.Но недостаточно заполнить поле ввода и нажать кнопку.

Пример кода: '

            <table class="MainTable">
                <tbody>
                <tr>
                    <td class="styleIndent">&nbsp;</td>
                    <td class="Labels"><span id="ctl00_MainContent_lblLastName" class="fieldHeader" for="ctl00_MainContent_txtLastName">Name:</span></td>
                    <td class="styleColumnBody">
                        <input name="ctl00$MainContent$txtLastName" type="text" value="sberbank" maxlength="250" id="ctl00_MainContent_txtLastName" tabindex="2" title="Enter name as search criteria." style="width:200px;">
                    </td>
                    <td class="Labels"><span id="ctl00_MainContent_lblCity" class="fieldHeader" for="ctl00_MainContent_txtCity">City:</span></td>
                    <td class="styleColumnBody">
                        <input name="ctl00$MainContent$txtCity" type="text" maxlength="250" id="ctl00_MainContent_txtCity" tabindex="6" title="Enter city name as search criteria." style="width:200px;">
                    </td>
                </tr>
                <tr>

                    <td class="Labels"></td>
                    <td style="text-align: left">
                        <input type="submit" name="ctl00$MainContent$btnSearch" value="Search" id="ctl00_MainContent_btnSearch" tabindex="9" style="font-weight:normal;height:22px;width:96px;">&nbsp;&nbsp;
                        <input type="submit" name="ctl00$MainContent$btnReset" value="Reset" id="ctl00_MainContent_btnReset" tabindex="10" style="font-weight:normal;height:22px;width:96px;">
                    </td>
                </tr>
            </tbody></table>

'

Это классическая .Net, гдестраница перезагружается нажатием кнопки ( ctl00_MainContent_btnSearch ).Так что трудно что-либо узнать, просматривая страницу:

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Если форма является стандартной HTML-формой, вы можете получить URL обратной ссылки, а затем опубликовать данные формы самостоятельно.По сути, вы выполняете действие, которое кнопка обычно выполняет вместо заполнения самой формы.

Чтобы это работало, вам нужен URL-адрес, на который отправляется сообщение, и имя элементов, которые отправляются обратно на сервер.Вы можете легко получить это через любые инструменты веб-инспектора.Получив его, вы можете сделать следующее:

var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = HttpMethod.Post.ToString();
request.ContentType = "application/json";

// replace name1, name2, value1, value2 with the 
// key value pairs that need to be posted.
var content = $"{name1}={value1}&{name2}={value2}"

using (var writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(content);
}

request.ContentLength = content.Length;
using (var response = (HttpWebResponse)request.GetResponse())
{
    var encoding = Encoding.GetEncoding(response.CharacterSet);

    using (var responseStream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(responseStream, encoding))
        {
            return reader.ReadToEnd();
        }
    }
}

Если вы используете .NET 4.5 или выше, вы можете использовать класс HttpClient , что значительно упрощает эту задачу:

var httpClient = new HttpClient();
response = await httpClient.PostAsync(uri, new StringContent(data));

response.EnsureSuccessStatusCode();

string content = await response.Content.ReadAsStringAsync();
0 голосов
/ 01 апреля 2019

Html Agility Pack предназначен для анализа, запроса и манипулирования HTML DOM.Какой-то сканер был бы подходящим вариантом для этого.Но вы хотите запустить http-запрос, javascript-событие или что-нибудь, что находится за этими кнопками.Самый простой способ с большинством функций - это дистанционное управление веб-браузером.

Сначала установите Selenium и браузер-драйвер.Я использую Firefox здесь, поскольку он бесплатный, с открытым исходным кодом и следит за конфиденциальностью:

Install-Package Selenium.WebDriver
Install-Package Selenium.Firefox.WebDriver

Загрузите исполняемый файл драйвера вашего браузера.Драйвер геккона Firefox можно найти на github здесь: https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-win64.zip Обзор версии, если пост стареет: https://github.com/mozilla/geckodriver/releases

Теперь запустите архив и скопируйте его путь к переменной:

string geckoDriverPath = @"D:\Downloads\geckodriver-v0.24.0-win64";

Мы готовы начать использовать Firefox.Простой пример, который вводит какой-либо запрос в поле поиска stackoverflow и нажимает кнопку поиска справа:

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
using System;

class Program {
    static void Main(string[] args) {
        string geckoDriverPath = @"D:\Downloads\geckodriver-v0.24.0-win64";
        using (var driver = new FirefoxDriver(geckoDriverPath)) {
            driver.Navigate().GoToUrl("https://stackoverflow.com");
            var searchBox = driver.FindElementByCssSelector("#search .js-search-field");
            searchBox.SendKeys("Selenium");

            var searchButton = driver.FindElementByCssSelector("#search .js-search-submit");
            searchButton.Click();
            Console.Read();
        }
    }
}

Пожалуйста, наберитесь терпения, для инициализации браузера может потребоваться несколько секунд.

В зависимости от того, что делает нажатие вашей кнопки, могут быть другие способы.Если это какой-то запрос http (вызов формы или ajax), вы можете отправить его вручную.Это быстрее, экономит ресурсы и вы можете легко запустить его без головы.Но это сложнее понять.Особенно на сложных страницах, где вам нужно извлечь данные, такие как идентификаторы из источника страницы.Вы можете рассмотреть это, если вы заботитесь о производительности и ресурсах.

0 голосов
/ 01 апреля 2019

Как насчет использования безголового хрома? Вы можете перейти на веб-страницу и выполнить любую операцию, если хотите.

https://github.com/kblok/puppeteer-sharp

// lauch browser and save in variable
var _browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
    Headless = true,
    ExecutablePath = _config.ChromePath, // get path to chrome executable
});
// go to page
var _page = await _browser.NewPageAsync();
var page.GoToAsync("http://www.example.com");

// click on form input 
await _page.ClickAsync("#name");
// set data
await _page.Keyboard.SendCharacterAsync("John");
// submit form
await _page.ClickAsync("#SubmitButton");
...