Как я могу вызвать метод в Event и наоборот C# - PullRequest
0 голосов
/ 05 мая 2020

У меня два класса, у каждого класса есть события для себя. первый класс имеет два события:

public class Crawler
    {
        public event EventHandler CrawlingComplete;
        public event EventHandler NextPage;


        protected virtual void OnCrawlingComplete(EventArgs e)
        {
            CrawlingComplete?.Invoke(this,e);
        }
        protected virtual void OnNextPage(EventArgs e)
        {
            NextPage?.Invoke(this,e);
        }



        public IWebDriver Driver { get; set; }

        public By NextButton { get; set; }

        public virtual void Start()
        {

            var nextButton= Driver.FindElement(NextButton);
            if (nextButton!=null&&nextButton.Enabled&&nextButton.Displayed )
            {
                nextButton.Click();

                OnNextPage(EventArgs.Empty);
            }
            else
            {
                OnCrawlingComplete(EventArgs.Empty);
            }

        }
    }

, а второй класс имеет одно событие:

public class Scraper
    {
        public event EventHandler ScrapingComplete;

        protected virtual void OnScrapingComplete(EventArgs e)
        {
            ScrapingComplete?.Invoke(this, e);
        }


        public IWebDriver Driver { get; set; }
        public By Element { get; set; }
        private List<string> Result { get; set; } = new List<string>();
        public void Start()
        {
            var findElements = Driver.FindElements(Element);

            foreach (var findElement in findElements)
            {
                if (findElement != null && findElement.Displayed && findElement.Enabled)
                {
                    Result.Add(findElement.Text);
                }
            }
            OnScrapingComplete(EventArgs.Empty);
        }

        private void SaveToFile()
        {
            System.IO.File.AppendAllLines(@"L:\ebooks\asdad.txt",Result);
        }
    }

в окончательном объединении этих классов в третий класс:

public class Spider
    {
        public IWebDriver Driver { get; set; }

        public Crawler _crawler;
        public Scraper _scraper;
        public void SetUrl(string url)
        {
            Driver.Navigate().GoToUrl(url);
            Driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(3000);

        }

        public void SetSpider(Crawler crawler, Scraper scraper)
        {
            _crawler = crawler;
            _scraper = scraper;

            _scraper.Driver = Driver;
            _crawler.Driver = Driver;
        }

        public void Start()
        {
            Scraping();
        }

        private void Crawling()
        {
            _crawler.NextButton = By.CssSelector("a.nextpostslink");
            _crawler.Start();
            _crawler.NextPage += _crawler_NextPage;
        }



        private void Scraping()
        {
            _scraper.Element = By.CssSelector("div.wp-post-details-img > div > a > h2");
            _scraper.Start();
            _scraper.ScrapingComplete += Scraper_ScrapingComplete;
        }

        private void _crawler_NextPage(object sender, EventArgs e)
        {
            Console.ForegroundColor=ConsoleColor.DarkYellow;
            Console.WriteLine("crawler event fired!");
            Scraping();
        }

        private void Scraper_ScrapingComplete(object sender, EventArgs e)
        {
            Console.ForegroundColor=ConsoleColor.Magenta;
            Console.WriteLine("scraper event fired!");
            Crawling();
        }
    }

и третий используется в Program.cs:

class Program
    {
        static void Main(string[] args)
        {
            Console.ForegroundColor=ConsoleColor.DarkYellow;
            Console.WriteLine(" fired!");

            Spider spider = new Spider();
            spider.Driver = new ChromeDriver();

            //persian script crawler
            Crawler psCrawler = new Crawler {NextButton = By.CssSelector("a.nextpostslink")};

            //persian script Scraper
            Scraper psScraper = new Scraper {Element = By.CssSelector("div.wp-post-details-img > div > a > h2")};


            spider.SetUrl("https://www.persianscript.ir/");
            spider.SetSpider(psCrawler,psScraper);
            spider.Start();


            Console.ReadKey();
        }
    }

Как вы можете видеть в классе Spider, я вызвал событие краулера, которое вызывает scrap, и искатель вызова событий парсера. по этой причине сначала запустите метод очистки, затем запустите метод сканирования (для сканирования и очистки страниц по одной - событие l oop)

, но события не возникают. я не знаю почему.

1 Ответ

1 голос
/ 05 мая 2020

хотя бы в этих двух местах вы должны подписаться перед началом работы

    private void Crawling()
    {
        _scraper.ScrapingComplete += Scraper_ScrapingComplete;
        _crawler.NextPage += _crawler_NextPage;
        _crawler.Start();
    }

    private void Scraping()
    {
        _scraper.ScrapingComplete += Scraper_ScrapingComplete;
        _scraper.Start();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...