c # Selenium youtube Search sendkeys

Aug 29 2020

Tôi muốn tìm kiếm trên youtube. Trang mở ra, nhấp để tìm kiếm, nhưng tôi gặp lỗi khi viết.

OpenQA.Selenium.ElementNotInteractableException: 'element not interactable
var chromeDriverService = ChromeDriverService.CreateDefaultService();
            chromeDriverService.HideCommandPromptWindow = true;
            IWebDriver driver;
            ChromeOptions options = new ChromeOptions();
            options.AddUserProfilePreference("profile.default_content_setting_values.images", 2);
            options.AddArgument("start-maximized");
            options.AddArgument("disable-infobars");
            options.AddArgument("--disable-extensions");
            driver = new ChromeDriver(chromeDriverService, options);
            driver.Navigate().GoToUrl("https://www.youtube.com/");
            IWebElement search = driver.FindElement(By.Id("search-form"));
            search.Click();
            WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, 10));
            search.SendKeys("xyz");

Trả lời

1 CoolBots Aug 29 2020 at 14:53

Có một số vấn đề với cách tiếp cận của bạn:

  • Phần tử bạn đang tìm By.Idphải là "tìm kiếm", không phải "biểu mẫu tìm kiếm"
  • Có 4 phần tử trên trang chủ youtube.com có ​​id là "tìm kiếm"
  • Trang có thể không tải đầy đủ khi bạn đang truy cập các phần tử. Việc sử dụng của bạn WebDriverWaitcũng không chính xác.

Giải pháp:

  • Tìm tất cả các phần tử có id là "search" khi chúng có sẵn và lấy phần tử đầu vào :
var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;

ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference("profile.default_content_setting_values.images", 2);
options.AddArgument("start-maximized");
options.AddArgument("disable-infobars");
options.AddArgument("--disable-extensions");
            
var driver = new ChromeDriver(chromeDriverService, options);
driver.Navigate().GoToUrl("https://www.youtube.com/");

// New code - get the input element with id "search" once it's ready            
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(1500));            
var elementsWithSearchID = wait.Until((driver) => driver.FindElements(By.Id("search")));
var search = elementsWithSearchID.Where(e => e.TagName == "input").FirstOrDefault();

// No need to click it - just send text with a `\n`, 
// which simulates typing the text and pressing the enter key
search.SendKeys("Hello\n");