如何找到动态元素并通过Selenium和C#发送文本

时间:2018-12-06 10:46:56

标签: c# selenium selenium-webdriver xpath css-selectors

编辑:不确定是否真的有帮助弄清楚,但这是基于Sharepoint的。

我有一个带有特殊字符的元素,Webdriver无法找到它。

var element = wait.Until(x => x.FindElement(By.Id("Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte")));
element.SendKeys("foo");

我想是引起问题的$

相反,我通过使用以下方法找到了它:

var element = wait.Until(x => x.FindElements(By.CssSelector("div[id*='Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592']")));
element[2].FindElement(By.TagName("p")).SendKeys("foo");

测试通过了(看似),但是该值并未真正发送到该字段。 不幸的是,元素的层次结构上没有input标签,并且当手动插入文本时,我可以看到该值已插入<p>标签中。但是,如图所示,当使用<p>标签时,它实际上并没有帮助。

HTML:

<div class="ms-rtestate-write ms-rteflags-0 ms-rtestate-field" id="Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte" role="textbox" aria-haspopup="true" aria-labelledby="Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte_label" style="min-height: 84px;" contenteditable="true" aria-autocomplete="both" aria-multiline="true" RteDirty="true">
  <p>
    <span id="ms-rterangecursor-start" RteNodeId="1"></span>
    <span id="ms-rterangecursor-end"></span>
  ​</p>
</div>

3 个答案:

答案 0 :(得分:1)

除了实现两个 KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)androidKeyStore.getEntry("X", null); 之外,您还可以按以下步骤进行操作:

  • FindElement*

    CssSelector
  • wait.Until(x => x.FindElement(By.CssSelector("div.ms-rtestate-write.ms-rteflags-0.ms-rtestate-field[id^='Tasrit_'][aria-labelledby$='_inplacerte_label']>p"))).SendKeys("foo");

    XPath

更新

不过,该元素对我来说似乎是动态的,因此您需要诱使 WebDriverwait 以便使所需的元素可点击,并且可以使用以下任一解决方案:

  • wait.Until(x => x.FindElement(By.XPath("//div[@class='ms-rtestate-write ms-rteflags-0 ms-rtestate-field' and starts-with(@id,'Tasrit_')][contains(@aria-labelledby,'_inplacerte_label')]/p"))).SendKeys("foo");

    CssSelector
  • new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("div.ms-rtestate-write.ms-rteflags-0.ms-rtestate-field[id^='Tasrit_'][aria-labelledby$='_inplacerte_label']>p"))).SendKeys("foo");

    XPath

答案 1 :(得分:0)

我想该元素的ID中有多余的空间 :)试试这个:

wait.Until(x => x.FindElement(By.Id("Tasrit_6aecdca9-e3b9-4141-ae36-d537784f9592_$TextField_inplacerte")));
element.Click();

或DOM中该元素的ID值不同$TextField_inplacerte是解析为例如的变量。 spaceMonkey,undefined,5等。打开开发工具,找到元素,右键单击,检查并确认DOM中元素的实际ID。

如果与ID匹配(如果没有区别)相匹配,则可以使用dev tools API在当前打开的页面的DOM中搜索文本(包含该元素)。它可以是任何部分。 ID中的第六个字符不同:)

只需确保您提到的id的第一部分和24之间的空格是您可以解决的问题,

  1. 查看webdriver的代码,并在内部查看用于访问DOM元素的内容

  2. 在测试之前先加载jquery:

    var element = wait.Until(x => x.FindElements($('#id包含 空格))。SendKeys(“ foo”);

基本上,您可以使用jQuery获取元素引用,而不是使用webdriver方法来查找元素。如果可行的话,这是空间问题,这是由于应用程序的不良设计导致元素ID中有空格

可能就是CSS选择器路由起作用的原因。

答案 2 :(得分:0)

如果SendKeys()不起作用,您可以尝试使用JavaScript

IWebElement webElement = element[2].FindElement(By.TagName("p"));
driver.ExecuteJavaScript("arguments[0].setAttribute('value', 'arguments[1]')", webElement, "foo");