J'essaie de récupérer des éléments d'une page en utilisant Selenium. Actuellement, je suis bloqué sur la récupération du texte de l'infobulle de l'élément.
Html que je vois en utilisant les outils de développement (f12) pour un élément d'une page :
<div class="offer-page-sale-item offer-page-sale-item__actual" data-real-id="12345" data-id="12345-4">
<!-- Render product -->
<div class="item ">
<div class="discount price bare">
<div class="t1">
<span class="value">1</span>
<span class="cents">69</span>
<span class="eur">€</span>
</div>
</div>
<div class="tags tags_primary">
<div class="tag i tooltipstered"></div>
</div>
<div class="img"></div>
<div class="text">
<div class="title">[name of the product]</div>
<div class="pack">
<span class="ptitle"></span>
<span class="price"> </span>
</div>
</div>
<div class="infopop">
<div class="in"><span></span>
<div class="arrow_top"></div>
<div class="arrow_bottom"></div>
</div>
</div>
</div>
</div>
Si je consulte le code html de la source de la page (ctrl+u) pour le même élément, je vois :
<div class="offer-page-sale-item offer-page-sale-item__actual" data-real-id="12345" data-id="12345-4">
<!-- Render product -->
<div class="item ">
<div class="discount price bare">
<div class="t1">
<span class="value">1</span>
<span class="cents">69</span>
<span class="eur">€</span>
</div>
</div>
<div class="tags tags_primary">
<div title="[product price valid from]-[product price valid until]" class="tag i"></div>
</div>
<div class="img"></div>
<div class="text">
<div class="title">[name of the product]</div>
<div class="pack">
<span class="ptitle"></span>
<span class="price"> </span>
</div>
</div>
<div class="infopop">
<div class="in"><span></span>
<div class="arrow_top"></div>
<div class="arrow_bottom"></div>
</div>
</div>
</div>
</div>
La seule différence est donc à l'intérieur <div class="tags tags_primary">
étiquette. Comme je peux voir le texte lorsque j'utilise la source de la page, j'imagine que je devrais pouvoir le capturer ? Cependant, le pilote Selenium ne me donne que class="tag i tooltipstered"
et non class="tag i"
qui a title
attribut dont j'ai besoin.
J'ai essayé de le faire :
- utiliser
Actions class MoveToElement()
mais je n'ai toujours pas trouvé le titre de l'infobulle. - utiliser
IJavaScriptExecutor
pour obtenirinnerHtml
de<div class="tags tags_primary">
sans succès.
Si quelqu'un a des idées, il serait très apprécié.
UPD : Réécriture du code phyton @PDHide en c#. Création d'une extension pour IWebDriver :
public static IWebElement WaitUntilVisible(this IWebDriver driver, By itemSpecifier, int secondsTimeout = 10)
{
var wait = new WebDriverWait(driver, new TimeSpan(0, 0, secondsTimeout));
var element = wait.Until<IWebElement>(driver =>
{
try
{
var elementToBeDisplayed = driver.FindElement(itemSpecifier);
if (elementToBeDisplayed.Displayed)
{
return elementToBeDisplayed;
}
return null;
}
catch (StaleElementReferenceException)
{
return null;
}
catch (NoSuchElementException)
{
return null;
}
});
return element;
}
Il a ensuite été utilisé pour collecter le texte de l'infobulle :
using(IWebDriver _driver = new ChromeDriver())
{
_driver.Navigate().GoToUrl("https://www.maxima.lt/akcijos");
_driver.WaitUntilVisible(By.CssSelector("#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowallSelectionWrapper #CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll")).Click();
_driver.WaitUntilVisible(By.ClassName("close")).Click();
var tool = _driver.WaitUntilVisible(By.CssSelector("[class='tag i tooltipstered']"));
Actions actions = new Actions(_driver);
actions.MoveToElement(tool).Build().Perform();
var tooltip = _driver.WaitUntilVisible(By.ClassName("tooltipster-content"));
Console.WriteLine(tooltip.Text);
}