使用Selenium Webdriver

时间:2015-10-14 16:02:16

标签: java angularjs selenium xpath selenium-webdriver

我正在使用Selenium Webdriver并致力于在Chrome上自动化AngularJS Web App。在我点击应用程序的下拉列表之前,它一直很顺利。 每当我尝试从中选择一个值时,我的测试就会一直崩溃。我一直在研究这个问题,我只看到了两个解决方案(我已经尝试了但都没有工作)

  1. 使用Select对象。这不起作用,因为html标记不是<select>,而是<md-select>,这样就无法通过测试。
  2. 然后我尝试点击下拉元素并点击值 - driver.findElement(By.xpath("xpath to dropdown list")).click();driver.findElement(By.xpath("xpath do dropdown value")).click();
  3. 在示例2中,我还尝试将其创建为WebElement变量并将click()分开调用,但这也不起作用。

    关于如何解决这个问题的任何想法?

    更新

    下拉列表的HTML

    <div ng-switch-when="dropdown" class="ng-scope">
        <zf-form-dropdown>
            <div class="dropdown">
                <div layout="row">
                    <div flex="50" class="quote-label">
                        <p ng-bind-html="::label" class="ng-binding">Title</p>
                    </div>
                    <div ng-show="false" flex="10" class="tooltip-icon ng-hide" ng-click="showToolTip(field.get('toolTip'))" role="button" tabindex="0" aria-hidden="true"><img src="img/item-question@2x.png"></div>
    
                    <md-select flex="" ng-disabled="quote.isRated() || !input.enabled" ng-change="onDropdownChange()" ng-model="input.value" class="ng-valid md-default-theme ng-touched ng-dirty" role="combobox" id="select_0Q9" aria-haspopup="true" aria-expanded="false" aria-labelledby="select_label_0I1" tabindex="0" aria-disabled="false" aria-invalid="false" aria-owns="select_menu_0Q8"><md-select-label class="md-select-label md-placeholder" id="select_label_0I1"><span></span><span class="md-select-icon" aria-hidden="true"></span></md-select-label></md-select>
                </div>
            </div>
        </zf-form-dropdown>
    </div>
    

    我想要选择的值的HTML

    <md-option ng-value="::item.val" ng-selected="item.checked" ng-repeat="item in getOpts()" tabindex="0" class="ng-scope" role="option" aria-selected="false" id="select_option_0QD" value="MR">
        <div class="md-text ng-binding">Mr</div>
        <div class="md-ripple-container"></div>
    </md-option>
    

    下拉列表的xpath为//*[@id="select_0Q9"] 下拉值的xpath为//*[@id="select_option_0QD"]

3 个答案:

答案 0 :(得分:2)

如果你确定你的Xpath很好,那么你也可以点击使用javascriptexecutor,所以试试如下: -

WebElement element= driver.findElement(By.xpath("//md-option[@id='select_option_0QD']/div[1]"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

请随意根据您的方便在上面的代码中找到元素。

按照我的说法,下拉列表的xpath应如下所示: -

//md-option[@id='select_option_0QD']

我想要点击的第一个div的xpath是: -

//md-option[@id='select_option_0QD']/div[1]

如果您想要第二个值,请将[1]更改为[2]。

在另一个方面,您还可以将所有元素存储在列表中(如您所知,您可以使用select)并根据需要或全部点击它们。

为此您需要使用xpath,如: -

//md-option[@id='select_option_0QD']/div

现在将其实现为代码: -

List<WebElement> allelemts = driver.findElements(By.xpath("//md-option[@id='select_option_0QD']/div"));
  for(WebElement ele: allelemts){

    driver.findElement(By.xpath("//md-option[@id='select_option_0QD']")).click();

    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].click();", ele);

  }

希望它会对你有所帮助:)。

答案 1 :(得分:1)

由于您收到NoSuchElementException例外,我认为问题在于Selenium无法识别该元素。尝试以下任何wait方法,然后尝试单击该元素。

明确等待(最受欢迎)

WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementID")));

WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementID")));

隐含等待

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

睡眠:(除非绝对必要,否则尽量避免这种情况)

Thread.sleep(1000);

编辑:添加了使用findElements方法检查元素存在的代码。

在使用这些wait方法之前,您还可以使用findElements方法检查元素是否存在。

List<WebElement> element = driver.findElements(By.id("elementId"));
    if (element.size() == 0) {
            System.out.println("Element not found");
    } else{
            System.out.println("Element found");
    }

答案 2 :(得分:1)

我终于解决了这个问题!

我得到了Selenium IDE并记录了一个会话,我选择下拉菜单并选择我的值。然后我将该文件导出为java测试用例,并且能够读取选择值的行,它们是;

driver.findElement(By.cssSelector("#select_08D > #select_label_005 > span.md-select-icon")).click();
driver.findElement(By.id("select_option_08H")).click();

首先,他们都不使用xpath来查找元素,使用cssSelector找到下拉菜单本身,id找到值。

我只是再次交叉引用,id的值为select_option_08H,但在查看Google控制台时,我看到id的值为select_option_189 }