Selenium无法找到包含动态ID的元素

时间:2016-02-21 21:37:02

标签: selenium

我在点击页面上的以下下拉列表中的选项选项时遇到问题:

http://www.lan.com/es_co/sitio_personas/index.html

enter image description here

当我运行代码时:

    By byCabinSelect = By.cssSelector("select[name=\"campoComboCabina\"]");
    List<WebElement> cabinSelects = driver.findElements( byCabinSelect );
    for (WebElement cabinSelect : cabinSelects) {
         List<WebElement> Elements = cabinSelect.findElements(By.cssSelector("*"));
         System.out.println( Misc.getElementData(cabinSelect));
         System.out.println( Misc.getElementData(Elements) );   
    }

我可以看到我有一个似乎是正确的选择器,但元素的选项被标记为不可见:

tagName:         select
  id:           
  text:         
  innerHtml:    <option value="Y">Economy</option><option value="W">Premium Economy</option><option value="J">Premium Business</option>
  outerHtml:    <select name="campoComboCabina" class="" aria-disabled="false" style="display: none;"><option value="Y">Economy</option><option value="W">Premium Economy</option><option value="J">Premium Business</option></select>
  isDisplayed:  false
  isEnabled:    true
tagName:         option
  id:           
  text:         
  innerHtml:    Economy
  outerHtml:    <option value="Y">Economy</option>
  isDisplayed:  false
  isEnabled:    true
tagName:         option
  id:           
  text:         
  innerHtml:    Premium Economy
  outerHtml:    <option value="W">Premium Economy</option>
  isDisplayed:  false
  isEnabled:    true
tagName:         option
  id:           
  text:         
  innerHtml:    Premium Business
  outerHtml:    <option value="J">Premium Business</option>
  isDisplayed:  false
  isEnabled:    true

所以试图点击选项:

cabinSelect.findElement( By.xpath("option[.='Economy']") )
           .click(); 

失败了:

ElementNotVisibleException: Element is not currently visible and so may not be interacted with

更新

我一直在用Selenium IDE进行更多研究。似乎每次选择下拉列表中的项目时,它都具有不同的id,形式为ui-selectmenu-item- nnn 。但是,如果我列出所有元素,请在下拉列表后立即使用选择器

By.cssSelector("*[id^='ui-selectmenu-item-']")

我需要的3不在列表中。 Selenium IDE建议我也可以使用像

这样的东西
//a[contains(text(),'Economy')]

识别元素但使用

生成列表
By.xpath("//a[contains(text(),'Economy')]")

也无法返回我需要的元素。

是否存在Selenium无法看到的元素?

3 个答案:

答案 0 :(得分:1)

此网站的关键似乎是使用select2构建下拉列表,您无法使用传统方法进行选择。

这是工作脚本

    public class TestSelenium {
    static WebDriver driver;

    public static void main(String[] args) throws Exception {
        System.setProperty("webdriver.chrome.driver", "res/chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--test-type");

        WebDriver driver = new ChromeDriver(options);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get("http://www.lan.com/es_co/sitio_personas/index.html");

        try {
            Thread.sleep(5000);
        } catch (Exception e) {
        }
        driver.findElement(By.name("campoOrigen")).sendKeys("SGN");
        driver.findElement(By.xpath("//a[contains(text(),'SGN')]")).click();
        driver.findElement(By.name("campoDestino")).sendKeys("BOG");
        driver.findElement(By.xpath("//a[contains(text(),'BOG')]")).click();
        driver.findElement(By.name("campoFechaIda")).click();
        driver.findElement(By.xpath("//a[text()='22']")).click();
        driver.findElement(By.name("campoFechaVuelta")).click();
        driver.findElement(By.xpath("//a[text()='28']")).click();
        driver.findElement(
                By.xpath("//div[contains(@class,'campoComboCabinas')]//span[@class='ui-selectmenu-status']"))
                .click();
        driver.findElement(By.xpath("//div[contains(@class, 'ui-selectmenu-open')]//a[text()='Premium Economy']")).click();

        try {
            Thread.sleep(5000);
        } catch (Exception e) {
        }

        driver.quit();

    }
}

答案 1 :(得分:0)

使用官方方式从ddl中选择如下:

Select dropdownlist = new Select(driver.findElement(By.id("your-selector")));
dropdownlist.selectByVisibleText("Economy");

答案 2 :(得分:0)

在我的情况下,此代码正常运行:

WebElement element = driver.findElement(By.cssSelector("your_selector"));

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);