Użycie biblioteki Selenium do aktualizacji produktów w WooCommerce? Tak, to możliwe…

Selenium to popularna biblioteka służąca do testowania aplikacji internetowych w przeglądarkach. Ale czy można używać jej także w inny sposób? Oczywiście! Selenium automatyzuje przeglądarki i może wykonać praktycznie wszystko, co jesteś w stanie zrobić ręcznie w przeglądarce. Wyobraź sobie, że masz duży sklep internetowy z setkami produktów. Co miesiąc musisz zmieniać ceny. Robienie tego ręcznie to czasochłonna praca. Wykorzystajmy więc Selenium do tego zadania. Możemy napisać prosty skrypt raz i używać go za każdym razem, gdy będzie potrzeba aktualizowania cen.

Ja użyję języka C#, ale Selenium obsługuje także Java, Python, JavaScript, Kotlin czy Ruby. Najpierw musimy zalogować się automatycznie do naszego sklepu przy użyciu Selenium:

IWebDriver driver = new ChromeDriver();

driver.Navigate().GoToUrl("https://yourwebsite.com");

//clicking Rodo Accept
IWebElement searchfieldRODO = driver.FindElement(By.CssSelector("[id='cn-accept-cookie"));
searchfieldRODO.Click();

//admin parts
//logging to WP admin part
IWebElement login = driver.FindElement(By.CssSelector("[id='user_login']"));
string loginentry = "your login";
login.SendKeys(loginentry);
IWebElement password = driver.FindElement(By.CssSelector("[id='user_pass']"));
string passentry = "your password*";
password.SendKeys(passentry);
IWebElement SubmitLogin = driver.FindElement(By.CssSelector("[id='wp-submit']"));
SubmitLogin.Click();

Po zalogowaniu do panelu administratora WordPress (wp-admin), potrzebujemy jeszcze danych do wprowadzenia. Możesz korzystać z różnych formatów danych (np. JSON, dataframe, a nawet Google Sheets…). W tym przypadku użyłem prostej kolekcji generycznej .net List<type>. Moja lista zawiera tablicę stringów – ID produktu oraz cenę.

List<string[]> priceData2 = new List<string[]>();
priceData2.Add(new string[2] { "020z", "475" });
priceData2.Add(new string[2] { "4947", "564" });
priceData2.Add(new string[2] { "04948", "180" });
priceData2.Add(new string[2] { "04949", "036" });
priceData2.Add(new string[2] { "04951", "180" });
priceData2.Add(new string[2] { "4952", "711" });
priceData2.Add(new string[2] { "4953", "092" });
priceData2.Add(new string[2] { "4950", "918" });
priceData2.Add(new string[2] { "I204", "74" });
priceData2.Add(new string[2] { "956", "97" });
priceData2.Add(new string[2] { "04954", "135" });

Potrzebujemy pętli, która będzie iterować po tych danych i aktualizować ceny w WooCommerce. Proste – znajdź produkt po ID i zmień jego cenę. Użyję do tego pętli foreach w C#.

foreach (string[]a in priceData2)
{
    IWebElement Products = driver.FindElement(By.CssSelector("[id='menu-posts-product']"));
    Products.Click();
    IWebElement WszystkieProdukty = driver.FindElement(By.XPath("//*[@id=\"menu-posts-product\"]/ul/li[2]/a")); ;
    WszystkieProdukty.Click();
    IWebElement ProductSearch = driver.FindElement(By.CssSelector("[id='post-search-input']"));
    string productToSearch = a[0];
    ProductSearch.SendKeys(productToSearch);
    IWebElement SzukaJButton = driver.FindElement(By.CssSelector("[id='search-submit']"));
    SzukaJButton.Click();
    IWebElement ProductToChange = driver.FindElement(By.ClassName("row-title"));
    ProductToChange.Click();
    IWebElement PriceField = driver.FindElement(By.CssSelector("[id='_regular_price']"));
    string newPrice = a[1];
    PriceField.Clear();
    PriceField.SendKeys(newPrice);
    
    
    IWebElement Aktualizuj1 = driver.FindElement(By.CssSelector("[id='publish']"));
   
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2));
    wait.Until(d => Aktualizuj1.Enabled);
  
    IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
    executor.ExecuteScript("arguments[0].click();", Aktualizuj1);
}

Po zakończeniu operacji ceny zostaną zaktualizowane. W przykładzie lista jest krótka, ale możesz mieć setki produktów, które będą aktualizowane zdalnie. Na końcu możesz zamknąć przeglądarkę poleceniem Selenium:

 public void QuitDrive()
        {
            driver.Quit();
        }