Ci-dessous le code HTML pour la liste déroulante:
Select dropDown = new Select(driver.findElement(By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]")));
dropDown.selectByVisibleText("Expedited");
J'ai essayé de sélectionner les valeurs de la liste déroulante avec:
Select dropDown = new Select(driver.findElement(By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]")));
dropDown.selectByValue("8");
Erreur ci-dessous:
Exception dans le thread "main" org.openqa.selenium.NoSuchElementException: Impossible de localiser l'option avec la valeur: 8
<select name="PWCMasterPage$PWCWebPartManager$gwpTemplateFr1$TemplateFr1$drpProductType" id="PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType" tabindex="2" class="PWCDropDownList" profiledatamember="" profileid="TEMPLATE" onblur="this.Holder = GetControlHolder(this);" onchange="this.Holder = GetControlHolder(this);" onfocus="this.Holder = GetControlHolder(this);" data-val-subtype-type="none" controlscollectionname="TemplateFr1_drpProductType" data-configid="TemplateFr1_drpProductType" holdername="TemplateFr1Holder"> <option value=""></option> <option value="7">Expedited</option> <option value="8">Premier</option> <option value="9">Value</option> </select>
Ce qui a entraîné l'erreur ci-dessous:
Exception dans le thread "main" org.openqa.selenium.NoSuchElementException: Impossible de localiser l'élément avec du texte: accéléré
J'ai essayé en alternance avec selectByVisibleText et selectByIndex, ce qui a entraîné des erreurs similaires.
3 Réponses :
essayez la solution ci-dessous avec WebDriverWait pour éviter les problèmes de synchronisation:
WebDriverWait wait = new WebDriverWait(driver,30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("PWCDropDownList")));
Select drpCountry = new Select(element);
drpCountry.selectByValue("8");
J'ai déjà fait cela, cela n'a pas fonctionné. Une erreur similaire a été signalée: exception dans le thread "main" org.openqa.selenium.NoSuchElementException: impossible de localiser l'option avec la valeur: 8
pouvez-vous s'il vous plaît partager votre URL? et vérifiez également si votre élément n'est pas présent dans iframe si c'est le cas, vous devez passer à iframe avant de gérer votre élément ddrop down
C'est une URL interne
La méthode visibilitéOfElementLocated (By) dans le type ExpectedConditions n'est pas applicable pour les arguments (Select)
Laissez-nous continuer cette discussion dans le chat .
Utilisez-vous safari?
Si tel est le cas, il existe des problèmes connus avec Webdriver et safari. Le long et court est d'utiliser le pilote fourni par Apple.
Voici le problème du sélénium: https://github.com/SeleniumHQ/selenium/issues / 3145
Si vous regardez: https://webkit.org/blog/6900/webdriver-support -en-safari-10 /
Ils disent:
"Le pilote de Safari peut être lancé via
/ usr / bin / safaridriverexécutable, et la plupart des bibliothèques clientes fournies par Selenium lancez automatiquement le pilote de cette façon sans plus configuration. "
J'utilise chrome
tant pis alors :-) vous n'avez pas dit quel navigateur donc c'était une supposition. Pouvez-vous partager vos versions s'il vous plaît?
Chrome Version 83.0.4103.116, Selenium Standalone Server: selenium-server-standalone-3.141.59.jar chromedriver_win32
que diriez-vous de la version chromedriver? -et, utilisez-vous l'alpha du sélénium4? ou utilisez-vous du sélénium 3?
Y a-t-il une commande avec laquelle je peux le savoir, si je regarde le fichier téléchargé, je ne suis pas sûr
Cela signifie-t-il que vous n'utilisez pas maven ou gradle comme gestionnaire de dépendances? - de toute façon, lorsque vous avez téléchargé les bibliothèques, vous auriez téléchargé une version correspondant à votre chrome ....
continuons cette discussion dans le chat .
Le problème n'est pas le code java que vous avez fourni ou la source HTML.
J'ai créé une page Web simple avec votre html:
public void approach3_Javascript()
{
var dropdown = driver.findElement(dropdownIdentifier);
((JavascriptExecutor) driver).executeScript("arguments[0].value='8'", dropdown);
}
J'ai créé un simple classe de test - et cela fonctionne très bien! Coller le lot pour que vous puissiez voir que je ne fais rien d'autre que d'ouvrir la page, d'utiliser votre code et de sélectionner l'élément.
public void approach2_Clicks()
{
driver.findElement(dropdownIdentifier ).click(); // to activate
driver.findElement(dropdownIdentifier ).findElement(By.xpath("//*[@value='8']")).click();
}
À mon avis, le problème n'est pas le sélénium, le problème n'est pas le xpath, tant que vous faites ce que @ SeleniumUser002 dit dans sa réponse, le problème n'est pas l'accessibilité des objets.
Pensez à:
La première chose que je dirais pour vraiment résoudre ce problème est d'utiliser un point d'arrêt avant votre ligne brisée et de suivre lentement les actions qui mènent au problème. Vérifiez si la page se comporte différemment lors de l'exécution. Marcher lentement supprime également les problèmes de synchronisation et une fois que le code fonctionne une fois, s'il redevient floconneux, vous pouvez écarter le code et vous concentrer sur une meilleure stratégie d'attente.
Si cela ne fonctionne pas et que vous vous voyez TOUJOURS toutes les options présentes mais ne pouvez pas sélectionner, faites un vidage de ce que le sélénium peut voir:
private By dropdownIdentifier = By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]");
Cela pourrait vous aider à comprendre ce qui se passe pour résoudre le problème. Sans ces informations de débogage, personne ne peut vous dire quel est le problème - mais je peux suggérer des solutions!
Essayez ces ...
Configurez ceci:
@Test
public void debug_WhatAreMyOptions()
{
Select dropDown = new Select(driver.findElement(dropdownIdentifier));
System.out.println("dropdown has "+ dropDown.getOptions().size()+" options");
System.out.println("the options are....");
for (var dropdownOptions : dropDown.getOptions()) {
System.out.println(dropdownOptions.getText());
}
}
Ensuite, essayez les clics à l'ancienne sans objet de sélection:
public class StackTest {
private String baseUrl = "C:\\Git\\stackTest.html";
private WebDriver driver;
@Before
public void CreateWebDriver()
{
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(baseUrl);
}
@After
public void CloseAndQuitWebDriver() {
driver.close();
driver.quit();
}
@Test
public void approach1_ExistingCode()
{
Select dropDown = new Select(driver.findElement(By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]")));
dropDown.selectByValue("8");
}
}
Ou essayez notre vieil ami javascript:
<html><body>
<select name="PWCMasterPage$PWCWebPartManager$gwpTemplateFr1$TemplateFr1$drpProductType" id="PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType" tabindex="2" class="PWCDropDownList" profiledatamember="" profileid="TEMPLATE" onblur="this.Holder = GetControlHolder(this);" onchange="this.Holder = GetControlHolder(this);" onfocus="this.Holder = GetControlHolder(this);" data-val-subtype-type="none" controlscollectionname="TemplateFr1_drpProductType" data-configid="TemplateFr1_drpProductType" holdername="TemplateFr1Holder">
<option value=""></option>
<option value="7">Expedited</option>
<option value="8">Premier</option>
<option value="9">Value</option>
</select>
</body></html>
oui vous aviez raison, la liste déroulante est liée au moment de l'exécution seulement après avoir cliqué sur la liste déroulante
Mon instinct a rarement tort! :-) - Donc, l'une des options ci-dessus est de cliquer d'abord sur l'objet. Cliquez dessus, puis ajoutez probablement une attente jusqu'à ce qu'il soit rempli. mais si cette réponse fonctionne pour vous, marquez-la comme correcte afin que d'autres personnes puissent apprendre alors le travail est terminé
vous parlez de approach2_Clicks (), est-ce correct?
Salut Sree - essayez-les tous. Vous avez maintenant à la racine du problème (la liste ne se remplit pas avant un clic), même votre code d'origine peut fonctionner. Vous devez effectuer cette action pour remplir la liste avant de sélectionner. vous pourriez d'abord approcher2 fonctionnera, mais vous devrez peut-être également y mettre une attente en fonction de la façon dont les données sont chargées et du temps que cela prend ... la meilleure chose à faire est de l'essayer et de voir.
driver.findElement (liste déroulante) .click (); // pour activer Erreur: La méthode findElement (By) dans le type WebDriver n'est pas applicable pour les arguments (Select)
@Sree - cela fonctionne pour moi dans la source html que vous avez fournie .. Avez-vous défini private By dropdownIdentifier = By.xpath ("// * [@ id = \" PWCMasterPage_PWCWebPartManager_gwpTempl ateFr1_TemplateFr1_d rpProductType \ "]"); dans la même classe?
continuons cette discussion dans le chat .
Je le vois maintenant - j'ai renommé la variable après avoir ajouté des bits ici - c'est driver.findElement (dropdownIdentifier) ... etc ... faire correspondre cet identifiant que j'ai posté juste avant - j'ai mis à jour le message d'origine
Pouvez-vous vérifier si une iframe est présente sur la page?
@Sameer Comment puis-je vérifier cela?
Inspectez cet élément et dans la source de la page html, vérifiez au-dessus de cet élément si une balise html
iframeest présente n'importe où au-dessus.@Sree Veuillez lire pourquoi une capture d'écran HTML ou code ou erreur est un mauvais idée . Envisagez de mettre à jour la question avec du texte formaté basé sur du code HTML pertinent, des essais de code et une trace de pile d'erreurs. Sameer Arora
@SameerArora J'ai vérifié qu'il n'y a pas d'iframe présente.
Je viens de publier une réponse, mais elle est basée sur des informations que vous n'avez pas divulguées - pouvez-vous s'il vous plaît partager les versions que vous utilisez? (navigateur, pilote et sélénium) - si cela aide, le code a l'air bien!
J'utilise le navigateur Chrome.