【问题标题】:How to sendkeys to a <p> tag through C# and Selenium如何通过 C# 和 Selenium 将密钥发送到 <p> 标签
【发布时间】:2018-04-17 12:12:38
【问题描述】:

我想在文本区域内发送密钥“描述”。我已经尝试了所有可能的方法,但都不起作用。

元素的HTML:

<div class="ta-scroll-window ng-scope ta-text ta-editor form-control" ng-hide="showHtml">
  <div class="popover fade bottom" style="max-width: none; width: 305px;">
    <div class="arrow"></div>
    <div class="popover-content"></div>
  </div>
  <div class="ta-resizer-handle-overlay">
    <div class="ta-resizer-handle-background"></div>
    <div class="ta-resizer-handle-corner ta-resizer-handle-corner-tl"></div>
    <div class="ta-resizer-handle-corner ta-resizer-handle-corner-tr"></div>
    <div class="ta-resizer-handle-corner ta-resizer-handle-corner-bl"></div>
    <div class="ta-resizer-handle-corner ta-resizer-handle-corner-br"></div>
    <div class="ta-resizer-handle-info"></div>
  </div>
  <div id="taTextElement737852736512107" contenteditable="true" ta-bind="ta-bind" ng-model="html" ta-keep-styles="true" class="ng-pristine ng-valid ta-bind ng-empty ng-touched" an-form-object-name="Açıklama" name="Açıklama">
    <p>
      <br>
    </p>
  </div>
</div>

代码试用:

Dim action2 = New Actions(driver)
Dim cekbul2 = driver.FindElement(By.XPath("//*@id=""taHtmlElement737852736512107""]"))
cekbul2.SendKeys("Açıklama")
Console.Write("textarea send description")

 Dim cekbul2 = driver.FindElement(By.XPath("//textarea[@class='ng-pristine ng-untouched ng-valid ng-scope ta-bind ta-html ta-editor form-control ng-empty ng-hide' and @id='taHtmlElement737852736512107']"))

错误是:

"no such element: Unable to locate element does not work"  give error

【问题讨论】:

  • does not work 非常模糊。错误?是否找到元素?找到但没有输入文字?
  • "没有这样的元素:无法定位元素:"错误给出
  • 我在您提供的 HTML 中没有看到任何 &lt;textarea&gt; 标记
  • invalid selector: Unable to locate an element with the xpath expression //*@id="taHtmlElement737852736512107"] 因为以下错误:SyntaxError: 无法在“文档”上执行“评估”: string '//*@id="taHtmlElement737852736512107"]' 不是有效的 XPath 表达式。这个错误给
  • 你确定 xpath 是(或可能是)你想要的元素吗

标签: c# selenium selenium-webdriver xpath webdriver


【解决方案1】:

您的 html 中没有文本区域输入字段。 当您使用 xPath 时 '//textarea' 这意味着你正在寻找一个标签为&lt;textarea&gt; &lt;/textarea&gt;的元素

看起来你的 html 实际上是 div 的样式,看起来像文本区域。 这就是为什么您的第二次尝试永远不会成功的原因 - 因为您正在寻找一个不存在的文本区域。

通常,在将 div 设置为像文本区域或文本框一样工作的情况下,您会发现 div 后面有一个支持输入。 这些必须位于 &lt;form&gt; and &lt;/form&gt; html 中的标签 - 否则服务器将永远无法接收数据。 (Html 5 提供了处理这个问题的新方法——但那是另一回事了) 您能否检查您的完整 html,并查看是否可以找到最终包含文本内容的实际文本区域对象或输入类型对象。 键入一些虚拟文本,然后使用 chrome 或 firefox 中的 html 检查器工具来查找您的虚拟文本。

但是,如果帖子由 javascript 完成 - 您可能会发现 javascript 不使用输入或文本区域来包含文本,而是将其发布到任何表单元素的外部。这在论坛帖子页面等富文本模拟器中很常见。

如果是这种情况,您可能需要进行试验并找到适当的 html 元素,您需要将密钥发送到该元素才能使内容正常工作。 还有——你能试试吗

Dim cekbul2 = driver.FindElement(By.XPath("//div[@id='taHtmlElement737852736512107']"))

我忍不住注意到它有一个 xPath 语法错误——你没有开始 [方括号]——而且,在编程中,有时认为它是懒惰的通配符/使用动态的一种不好的做法。我建议始终为您的 xpath 使用标签类型,而不是 '//*'

在更糟糕的情况下,我会说您可以通过使用 Javascript 执行来解决这个问题。例如:直接设置文本,而不是“发送击键”。 但是,这并不能模仿人类的行为 - 但根据您的情况,它可能是必要的邪恶。

【讨论】:

  • 我明白。程序“没有这样的元素:无法找到元素:”这个错误给出。不同的网站
【解决方案2】:

要将文本发送到&lt;p&gt; 标签,您必须使用来自IJavaScriptExecutor 接口的ExecuteScript() 方法,您可以使用以下代码块:

((IJavaScriptExecutor)driver).ExecuteScript("document.getElementsByTagName("p")[0].innerHTML="Hasan Sarıkaya";");

【讨论】:

  • wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='ng-pristine ng-valid ta-bind ng-empty ng-touched' 和starts-with( @id,'taTextElement')]"))).SendKeys("Açiklama") ---> 1 秒后超时错误
  • @HasanSarıkaya 查看我的更新答案并告诉我状态。
【解决方案3】:

我想在这里强调一些要点

很可能您使用的定位器不正确。

我知道使用 selenium 输入文本的三种方式

1)使用 driver.findElement(yourLoator).sendKeys("Stringvalue");

2)你可以使用action类来发送key

3)您可以使用javascript执行器更改innerHtml代码

个人不喜欢第三种解决方案,因为我们是测试人员我相信更改 dom 属性是一个好习惯

希望这能给你一些帮助。如有任何疑问,请告诉我。

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多