0
votes

Comment construire un localisateur xpath ou css pour identifier l'élément à l'aide de Selenium et Java

Voici mon Html:

Wait wait = new FluentWait<WebDriver>(driver)
                .withTimeout(10, TimeUnit.SECONDS)
               .pollingEvery(3, TimeUnit.SECONDS);
       wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//label[contains(text(),'Name:')]")));
       ((JavascriptExecutor) driver).executeScript("arguments[0].click();", labelName);

searchName =@FindBy(css = "input.x-form-text.x-form-field.x-form-focus")
private WebElement searchByName;

searchByName.sendKeys(name);

J'ai essayé ci-dessous id "ext-comp-1060 est dynamique donc je ne peux pas l'utiliser.

xpath = "//div[@class='x-form-field-wrap x-form-field-trigger-wrap x-trigger-wrap-focus']//input[@class='input.x-form-text.x-form-field.x-form-focus']"

css = "input.x-form-text.x-form-field.x-form-focus"

Dans mon application, le même champ de saisie de texte que je dois utiliser deux fois l'une après l'autre la première fois que ça marche, j'ai essayé comme ceci:

<div class="x-form-item " tabindex="-1" id="ext-gen118">
    <label for="ext-comp-1060" style="width:40px;" class="x-form-item-label" id="ext-gen119">Name:</label>
    <div class="x-form-element" id="x-form-el-ext-comp-1060" style="padding-left:45px">
        <div class="x-form-field-wrap x-form-field-trigger-wrap x-trigger-wrap-focus" id="ext-gen120" style="width: 168px;">
            <input type="text" size="16" autocomplete="off" id="ext-comp-1060" name="ext-comp-1060" class="x-form-text x-form-field x-form-focus" style="width: 143px;" title="">
            <span class="x-form-twin-triggers" id="ext-gen121">
                <img src="/mco/extjs/resources/images/default/s.gif" alt="" class="x-form-trigger x-form-clear-trigger" id="ext-gen122" style="display: none;">
                <img src="/mco/extjs/resources/images/default/s.gif" alt="" class="x-form-trigger x-form-search-trigger" id="ext-gen123">
            </span>
        </div>
    </div>
    <div class="x-form-clear-left"></div>
</div>

Mais en même temps la deuxième fois ça ne marche pas


6 Réponses :


0
votes

Est-ce que seuls les nombres changent ou le mot entier? Si seuls les nombres changent, vous pouvez l'utiliser comme localisateur Css:

input[id^='ext-comp']


2 commentaires

Veuillez ajouter ceci en commentaire de la question car ce n'est certainement pas une réponse


modifier ma réponse dans quelque chose d'utile de toute façon, merci d'avoir ajusté @ D.Lawrence



0
votes

J'ai mis à jour votre xpath à l'aide de contains, essayez ceci:

xpath = "//div[contains(@class, 'x-form-field-wrap']/input[contains(@class, 'x-form-text']"


0 commentaires

0
votes

Utilisez le XPATH suivant qui identifiera l'élément d'entrée en référence à la balise d'étiquette Name:

// label [text () = 'Name:'] / following-sibling :: div [1] // input

Pour gérer l'élément dynamique, indiquez WebDriverWait et attendez elementToBeClickable()

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//label[text()='Name:']/following-sibling::div[1]//input"))).sendKeys("Hello");


2 commentaires

Merci à tous, j'ai essayé toutes les solutions mais rien ne fonctionne pour moi


En fait, j'ai deux mêmes champs de texte d'entrée dans mon application, donc le premier fonctionne.J'ai essayé comme ceci: css = "input.x-form-text.x-form-field.x-form-focus" avec wait mais en même temps fois pour la deuxième fois ça ne marche pas



0
votes

Vous pouvez essayer ci-dessous xpath donné.

//div[@class='x-form-element']//child::input[@type='text' AND size='16']

J'accède au champ de saisie en utilisant l'attribut type et size de l'élément Web via un élément de niveau parent.

Hope cela résoudra votre problème.


0 commentaires

1
votes

Pour cliquer () dans l'élément souhaité, vous devez induire WebDriverWait pour elementToBeClickable () et vous pouvez utiliser l'un des éléments suivants Stratégies de localisation :

  • cssSelector :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//label[@class='x-form-item-label' and starts-with(@id, 'ext-gen')][starts-with(@for, 'ext-comp-') and text()='Name:']"))).click();
    
  • xpath :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("label.x-form-item-label[id^='ext-gen'][for^='ext-comp-']"))).click();
    


0 commentaires

2
votes

Votre webelement est dynamique afin que vous puissiez rechercher une correspondance partielle pour l'attribut d'élément comme Id , class et Name code >

Attendre l'élément

    WebElement element = driver.findElement(byCss); 


    WebElement element = driver.findElement(byXpath);

    element.click(); 

Rechercher l'élément et cliquer:

    By byCss=By.cssSelector("input[id^='ext-comp-']");
    By byXpath= By.xpath("//label[.='Name:']//input");

    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.elementToBeClickable(byCss));

    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.elementToBeClickable(byXpath));


0 commentaires