web-dev-qa-db-fra.com

Webdriver Comment attendre que l'élément soit cliquable dans webdriver C #

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 

9
Anand S

En regardant dans le code source Java, il me dit que deux choses sont fondamentalement en train de déterminer si elles sont cliquables:

https://code.google.com/p/Selenium/source/browse/Java/client/src/org/openqa/Selenium/support/ui/ExpectedConditions.Java

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 #):

  1. Attendez que l'élément soit renvoyé du DOM
  2. Attendez que la propriété .Displayed de l'élément devienne vraie (ce qui correspond essentiellement à ce que visibilityOfElementLocated recherche).
  3. Attendez que la propriété .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.

26
Arran

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

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("/");
            }
1
Phil Hudson

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 #

0
Laura Vieira