Il existe un bloc Ui qui couvre tous les éléments pendant quelques secondes après que l’élément ait été généré dans le navigateur, ce qui pose un problème. Depuis l’élément, le pilote Web essaie de cliquer sur l'élément mais le clic est reçu par Block UI . J'ai essayé d'utiliser l'attente jusqu'à mais je n'ai pas aidé, Depuis que je peux trouver isClickAble dans C # webdriver
var example = _wait.Until<IWebElement>((d) => d.FindElement(By.XPath("Example")));
var example2 = _wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(By.XPath("Example")));
example.click();
example2.click();
Existe-t-il un équivalent C # pour isClickAble? Merci d'avance
En regardant dans le code source Java, il me dit que deux choses sont fondamentalement en train de déterminer si elles sont cliquables:
Tout d'abord, il vérifiera s'il est 'visible' à l'aide du ExpectedConditions.visibilityOfElementLocated
standard, puis vérifiera simplement si la element.isEnabled()
est true
ou non.
Cela peut être légèrement condensé, cela signifie essentiellement (simplifié, en C #):
.Displayed
de l'élément devienne vraie (ce qui correspond essentiellement à ce que visibilityOfElementLocated
recherche)..Enabled
de l'élément devienne vraie (ce que recherche essentiellement la variable elementToBeClickable
).J'implémenterais ceci comme ceci (en ajoutant à l'ensemble actuel de ExpectedConditions
, mais il y a plusieurs façons de le faire:
/// <summary>
/// An expectation for checking whether an element is visible.
/// </summary>
/// <param name="locator">The locator used to find the element.</param>
/// <returns>The <see cref="IWebElement"/> once it is located, visible and clickable.</returns>
public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator)
{
return driver =>
{
var element = driver.FindElement(locator);
return (element != null && element.Displayed && element.Enabled) ? element : null;
};
}
Utilisable dans quelque chose comme:
var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id")));
Cependant, vous pourriez avoir une idée différente de ce que clickable pourrait vouloir dire. Dans ce cas, cette solution pourrait ne pas fonctionner - mais il s'agit d'une traduction directe de ce que le code Java fait.
Si vous rencontrez un problème tel que "Un autre élément recevrait le clic", vous pouvez utiliser une boucle while qui attend que cette zone de superposition disparaisse.
//The below code waits 2 times in order for the problem element to go away.
int attempts = 2;
var elementsWeWantGone = WebDriver.FindElements(By.Id("id"));
while (attempts > 0 && elementsWeWantGone.Count > 0)
{
Thread.Sleep(500);
elementsWeWantGone = WebDriver.FindElements(By.Id("id"));
}
Voici le code que j'utilise pour vérifier s'il est cliquable, sinon allez à une autre URL.
if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
{
logOutLink.Click();
}
else
{
Browser.Goto("/");
}
Je faisais face à ce problème et vérifier si l'élément était cliquable et visible n'était pas suffisant, Selenium n'attendait toujours pas.
La seule solution que j'ai trouvée pour mon cas était une mauvaise pratique, mais fonctionnelle comme solution de contournement. J'essaie de placer l'élément dans une boucle avec Try/Catch, comme indiqué ici dans la réponse Falgun Cont:
StackExchange - Comment attendre qu'un élément soit cliquable dans WebDriver en C #