Nie mogę wydawać się poprawnej składni XPath, aby znaleźć ten element, który ma dynamiczny początek pola ID, ale kończy się danymi statycznymi.

<select name="" autocomplete="off" id="edlbpDesktopFfqp_B005WJQUJ4-predefinedQuantitiesDropdown" tabindex="-1" class="a-native-dropdown">
                        <option value="1" selected="">
                            1
                        </option>
                        <option value="2">
                            2
                        </option>
                        <option value="3">
                            3
                        </option>
                        <option value="4">
                            4
                        </option>
                </select>

Próbowałem obu tych bezskutecznie:

var dd = driver.FindElement(By.XPath("//*[ends-with(@id,'predefinedQuantitiesDropdown')]"));
dd.Click();

I

var dd = driver.FindElement(By.XPath("//*[contains(@id, 'predefinedQuantitiesDropdown')]"));
dd.Click();

Twoja pomoc byłaby bardzo doceniana.

1
Roro 1 marzec 2019, 23:12

2 odpowiedzi

Najlepsza odpowiedź

ends-with Funkcja ograniczenia XPATH jest częścią xpath v2.0 , ale zgodnie z bieżącym wdrożeniem Selenium obsługuje xpath v1.0 .

Szczegółową dyskusję można znaleźć w Jak znaleźć element na podstawie tego, co kończy się jego wartość w Selen?

Ponieważ element jest elementem dynamicznym do Click() na żądanym elemencie musisz wywołać webdriverwait dla pożądanego ElementobeClickable i możesz użyć jednego z poniższych Strategie lokalizatora jako rozwiązania:

  • CssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("select.a-native-dropdown[id$='predefinedQuantitiesDropdown']"))).Click();
    
  • XPath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//select[@class='a-native-dropdown' and contains(@id, 'predefinedQuantitiesDropdown')]"))).Click();
    

Uwaga : Jednak zgodnie z najlepszymi praktykami jako żądany element to znacznik <select>, więc idealnie musisz użyć Selektywna klasa i jego metody z Openqa.selenium.Support.ui przestrzega przestrzeni nazw, aby wybrać dowolną opcję.

1
DebanjanB 1 marzec 2019, 21:57

Powinieneś użyć klasy Select, aby wybrać element przed upuszczaniem. Możesz spróbować dowolnej z poniższej metody. Poprzez to pomaga.

import org.openqa.selenium.support.ui.Select;



 Select select=new Select(driver.findElement(By.xpath("//select[contains(@id ,'predefinedQuantitiesDropdown')]")));

   select.selectByVisibleText("1"); //text visible on drop down
   select.selectByValue("1");     //value attribute on option tag
   select.selectByIndex(1);       //Index 1,2....n
0
KunduK 1 marzec 2019, 21:03