Selenium NoSuchElementException在输入字段上

时间:2018-09-04 02:18:07

标签: java selenium xpath css-selectors webdriver

我尝试通过Java Selenium将Keys发送到输入字段。我每次都会收到NoSuchElementException。我还尝试了此解决方案中的所有内容:NoSuchElementExeption, selenium unable to locate element。预先感谢!

driver.findElement(By.xpath("//input[@class='pull-left ng-pristine ng-validng-empty ng-touched']")).sendKeys(t + Keys.ENTER);

<input class="pull-left ng-pristine ng-valid ng-empty ng-touched" ng-model="TagInputCtrl.tagInput" uib-typeahead="tagSuggestion for tagSuggestion in TagInputCtrl.getTagSuggestions($viewValue)" select-on-comma="" select-on-whitespace="" select-on-blur="" typeahead-focus-first="false" tag-select="TagInputCtrl.onEnter" tag-select-model="ngModel" sprd-max-input-length="50" ng-show="ngModel.length < TagInputCtrl.validatorOptions.tags.max" ng-focus="TagInputCtrl.focused = true" ng-blur="TagInputCtrl.focused = false" aria-autocomplete="list" aria-expanded="false" aria-owns="typeahead-4377-3960" style="" type="text"/>

2 个答案:

答案 0 :(得分:0)

NoSuchElementException可能有两件事:

  1. 您的定位器不正确。

如果是这种情况,那么您可以尝试使用此xpath:

//input[contains(@class,'pull-left ng-pristine ng-valid ng-empty ng-touched') and @ng-model='TagInputCtrl.tagInput' and @ng-focus='TagInputCtrl.focused = true']  

您的网页已与Angular集成。因此,提供的xpath应该可以工作。

  1. 您的输入代码可能位于 iframe / frame / frameset 中。

如果是这种情况,那么我建议您将驱动程序的焦点切换到特定的iframe,以与欲望元素进行交互。

要进行切换,您可以尝试以下代码:

driver.switchTo().frame(name_or_id)  

通常, iframe 标记包含名称或id属性,以防万一它们都不可用,您可以继续

driver.switchTo().frame(index)  

driver.switchTo().frame(iframe_element)  

在这里, iframe_element 是一个网络元素。

希望这会有所帮助。

答案 1 :(得分:0)

要发送字符序列,因为所需元素是Angular元素,因此您需要诱使 WebDriverWait 使元素可点击< / em>,则可以使用以下任一解决方案:

  • cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input.pull-left.ng-pristine.ng-valid.ng-empty.ng-touched[ng-model^='TagInputCtrl']"))).sendKeys("Tim");
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@class='pull-left ng-pristine ng-valid ng-empty ng-touched'][contains(@ng-model,'TagInputCtrl')]"))).sendKeys("Tim");