¿Usar la biblioteca Selenium para actualizar productos en WooCommerce? Sí, es posible…

Selenium es una biblioteca popular diseñada para pruebas de aplicaciones web en navegadores. Pero, ¿se puede usar para otras cosas? Claro que sí. Selenium automatiza los navegadores y puede hacer prácticamente todo que puedes hacer tú en un navegador web. Imagina que tienes una tienda online grande con cientos de productos. Cada mes necesitas cambiar todos los precios. Hacerlo manualmente lleva mucho tiempo, por lo tanto, usamos Selenium para este trabajo.Podemos escribir un script sencillo una vez y utilizarlo cada vez que necesitemos actualizar los precios.

Yo utilizaré C#, pero Selenium también es compatible con Java, Python, JavaScript, Kotlin o Ruby. Primero, necesitamos iniciar sesión automáticamente en nuestra tienda con 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();

Una vez iniciada la sesión en el panel de administración de WordPress, necesitaremos los datos que se van a ingresar. Puedes usar varios formatos de datos (como JSON, Data Frame o incluso Google Sheets…). En este caso, utilicé una colección genérica de .net – List<type>. Mi lista contiene arreglos de tipo string – el ID del producto y el precio.

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" });

Necesitamos un bucle que realice la operación de cambiar los precios en WooCommerce. Es simple: encontrar el producto por su ID y cambiar el precio. Usaré un bucle foreach en 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);
}

Después de esta operación, los precios quedan actualizados. Mi lista en este ejemplo es corta, pero puedes tener cientos de productos que se actualizarán automáticamente. Al final, puedes cerrar el navegador con un comando de Selenium:

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