编辑:不确定是否真的有帮助弄清楚,但这是基于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>
答案 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之间的空格是您可以解决的问题,
查看webdriver的代码,并在内部查看用于访问DOM元素的内容
在测试之前先加载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");