Selenium webdriver проблема с циклом повтора действий

160
27 октября 2019, 01:50

Всем привет, есть такой код который я не могу допилить чтобы он выполнял одно и то же действие до определённого периода т.е. количества. Ребята пожалуйста помогите!

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using Keys = System.Windows.Forms.Keys;
namespace SearchNewsWithGoogle
{
    public partial class Form1 : Form
    {
        IWebDriver Browser;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
    ((IJavaScriptExecutor)Browser).ExecuteScript("window.open();");
    Browser.SwitchTo().Window(Browser.WindowHandles.Last());
    Browser.Navigate().GoToUrl("https://yandex.ru");
    System.Threading.Thread.Sleep(5000);
    List<IWebElement> News = Browser.FindElements(By.CssSelector("#tabnews_newsc a")).ToList();
    {
        for (int i = 0; i < 1000; i++)
        {
            string s = News[i].Text;
            if (s.StartsWith("c"))
            {                           
                ((IJavaScriptExecutor)Browser).ExecuteScript("window.open();");
                Browser.SwitchTo().Window(Browser.WindowHandles.Last());
                Browser.Navigate().GoToUrl("http://google.com");                        
                System.Threading.Thread.Sleep(5000);
                IWebElement SearchInput = Browser.FindElement(By.Id("searchform"));
                System.Threading.Thread.Sleep(5000);
                SearchInput.SendKeys(s + OpenQA.Selenium.Keys.Enter);
                System.Threading.Thread.Sleep(10000);
                var tabs = Browser.WindowHandles;
                if (tabs.Count > 1)
                {
                    Browser.SwitchTo().Window(tabs[2]);
                    Browser.Close();
                    Browser.SwitchTo().Window(tabs[1]);
                    Browser.Close();
                    Browser.SwitchTo().Window(tabs[0]);
                }
                return;
              }
           }
       }
    }
 }

} }

Answer 1

выносим некоторые общие методы в расширения:

public static class WebDriverExt
{
    public static void OpenNewTab(this IWebDriver driver)
    {
        ((IJavaScriptExecutor)driver).ExecuteScript("window.open();");
        driver.SwitchTo().Window(driver.WindowHandles.Last());
    }
    public static List<IWebElement> WaitElements(this IWebDriver driver, By elementLocator, int timeoutMs = 10000)
    {
        try
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(timeoutMs));
            var result = wait.Until(d => d.FindElements(elementLocator));
            return result.ToList();
        }
        catch (NoSuchElementException)
        {
            Console.WriteLine($"Элементы не были найдены за {timeoutMs}ms");
            throw;
        }
    }
}

а теперь вызывающий код. я позволил себе немного его "причесать". логику закрытия вкладок я совсем не понял, поэтому оставлю ее вам

public static void Run()
{
    IWebDriver Browser = new ChromeDriver();
    Browser.Navigate().GoToUrl("https://yandex.ru");
    Browser
        .WaitElements(By.CssSelector("#tabnews_newsc a"))
        .Select(n=> n.Text)
        //.Where(s=> s.StartsWith("с"))     // внимание, русское "с"
        .Take(10)                           // берем 10 первых элементов
        .ToList()
        .ForEach(s =>
        {
            Browser.OpenNewTab();
            Browser.Navigate().GoToUrl("http://google.com");
            var searchInput = Browser
                .WaitElements(By.XPath("//form//input[@type='text']"))
                .First();
            searchInput.Click();
            searchInput.SendKeys(s + Keys.Enter);
            Thread.Sleep(5000);
        });
}
READ ALSO
Получение ссылки на запись разговора Asterisk (AsterNET C#)

Получение ссылки на запись разговора Asterisk (AsterNET C#)

Как можно получить с помощью библиотеки AsterNET получить ссылку на файл записи разговора в Asterisk? Есть CRM, в ней есть библиотека AsterNETПри входящем...

122
Конвертировать BSTR* retVal что бы вывести string в printf

Конвертировать BSTR* retVal что бы вывести string в printf

на шарпе написана DLL вызывается в С++, в DLL передаю строку и обратно должен получить строку, но как ее вывести на экран

121
wordpress 5 и gutenberg вывести на странице изображения

wordpress 5 и gutenberg вывести на странице изображения

Необходимо вывести на странице с галереей изображения в том порядке в котором я их располагаю в редакторе gutenberg, а wp выводит их в порядке добавления...

138
Не получается войти в phpMyAdmin

Не получается войти в phpMyAdmin

Установил Apache2 и MySQL, настроил их, установил root пароль, в саму базу данных через консоль и root пароль заходит, а в phpMyAdmin никак не получаетсяВ...

152