通过Selenium,ChromeDriver和Chrome执行测试时出现“消息=未知错误:无法聚焦元素”

时间:2018-08-27 09:42:03

标签: c# selenium google-chrome webdriver selenium-chromedriver

我正在尝试在Google Chrome浏览器中发送下拉列表的密钥,但是我收到此错误

OpenQA.Selenium.WebDriverException
  HResult=0x80131500
  Message=unknown error: cannot focus element
  (Session info: chrome=68.0.3440.106)
  (Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.17134 x86_64)
  Source=WebDriver
  StackTrace:
   at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebElement.SendKeys(String text)
   at BnI.UITests.Register.TheOfficialInfoValidTest() in C:\Users\me\UITests\Register.cs:line 382

这是我的方法:

driver.FindElement(By.XPath("(.//*[normalize-space(text()) and normalize-space(.)='Country:'])[1]/following::span[2]")).SendKeys("USA");

这在html中看起来如何:

<div _ngcontent-c4="" class="col-xs-8 no-padding-sides ng-star-inserted" style="">
   <kendo-dropdownlist _ngcontent-c4="" class="custom-dropdown k-widget k-dropdown k-header ng-pristine ng-invalid ng-touched" formcontrolname="countryId" dir="ltr">
      <span role="listbox" unselectable="on" class="k-dropdown-wrap k-state-default" id="k-d0697a91-baeb-4960-bfc1-c023903c1159" dir="ltr" readonly="false" tabindex="0" aria-disabled="false" aria-readonly="false" aria-haspopup="true" aria-expanded="false" aria-owns="dbfc0894-a4f5-4f1b-881f-1d88ccdc6002" aria-activedescendant="f65cbfa2-6280-4a84-908b-ba11da75d59d-undefined">
         <span unselectable="on" class="k-input">
            <!----><!---->Select Country ...
         </span>
         <span unselectable="on" class="k-select"><span class="k-i-arrow-s k-icon"></span></span><!---->
      </span>
      <!----><!---->
   </kendo-dropdownlist>
</div>

这是XPath:

xpath=(.//*[normalize-space(text()) and normalize-space(.)='Country:'])[1]/following::span[2]

如果我想使用Selenium IDE单击它,则dropdownlist值将如何显示,因为该值是从数据库中检索的:

  1. 首先我点击了下拉列表
  2. 第二个我选择了国家

enter image description here

还有其他方法可以通过硒键盘代替发送键来增加价值吗?

2 个答案:

答案 0 :(得分:1)

根据您共享的HTML,目标元素是一个<span>标签,因此您将无法调用SendKeys()方法。相反,您需要诱使 WebDriverWait 以便使所需元素可单击,并且可以使用以下任一解决方案:

new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[@class='k-dropdown-wrap k-state-default' and @role='listbox']/span[@class='k-input']"))).Click();
//or
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[@class='k-dropdown-wrap k-state-default' and @role='listbox']//span[@class='k-select']"))).Click();

答案 1 :(得分:0)

Actions actions = new Actions(WebdriverName);
actions.moveToElement(locator).click();

您可以使用Actions库来解决问题。 moveToElement允许元素通过webdriver聚焦。同样,在创建驱动程序名称时,请使用ExpectedCondition设置一个等待方法。

WebDriverWait wait = new WebDriverWait(WebdriverName, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.tagName(locator)));