用于在文本字段中键入的Javascript执行与sendKeys不同
我在Linux机器上运行我的测试,并且有以下代码,它不能正确地键入文本-用于在文本字段中键入的Javascript执行与sendKeys不同,javascript,java,selenium,selenium-webdriver,selenium-chromedriver,Javascript,Java,Selenium,Selenium Webdriver,Selenium Chromedriver,我在Linux机器上运行我的测试,并且有以下代码,它不能正确地键入文本- visibleElement.clear(); visibleElement.sendKeys("I am running on linux machine"); 在UI中,实际上输入了不同的文本,比如“在linux机器上运行”、“在linux机器上运行”等等 因此,为了处理这个问题,我像- JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeS
visibleElement.clear();
visibleElement.sendKeys("I am running on linux machine");
在UI中,实际上输入了不同的文本,比如“在linux机器上运行”、“在linux机器上运行”等等
因此,为了处理这个问题,我像-
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].value='I am running on linux machine';", visibleElement);
这会按文本字段中的方式键入文本,但键入后,会出现Save
按钮,该按钮预计将启用,但未启用
但如果使用了sendKeys
,则该按钮将启用
你能告诉我为什么这个javascript行为不同,并提供正确的javascript吗
这两种方法如何在单个解决方案中工作(不点击tab键启用按钮,因为这在我的情况下是不正确的)?尝试以承诺风格或异步/等待风格编写
async clear_elem(elem) {
// elem.clear(), MAY not work always because of some background JS
await elem.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, 'a'));
await elem.sendKeys(protractor.Key.DELETE);
// Can await here for Application Load
}
reverse_string = as => as.split('').reverse().join();
// intersperse - Places an Item in between elements of an array
// ex: intersperse('k')("abc") => ['a', 'k', 'b', 'k', 'c']
intersperse = x => as => as.split('').reduce((acc, x) => [...acc, a, x], []).slice(0, -1);
(async () => {
// Assuming you have element - visibleElement
await browser.wait(protractor.ExpectedConditions.elementToBeClickable(visibleElement), default_timeout);
await clear_elem(visibleElement);
const str = reverse_string('I am running on linux machine');
const sequence_of_characters = intersperse(protractor.Key.HOME)(str);
// e, HOME, n, HOME, i, HOME, h, HOME, ...
await visibleElement.sendKeys(protractor.Key.chord(...sequence_of_characters));
})();
设置
参数[0]。value=“…”
设置文本字段上的值,但不会在该元素上触发任何事件。“保存”按钮可能正在等待更改事件在
中的某个位置发生。您需要使用JavaScript在文本框上手动触发更改事件。看
您描述的行为让我觉得JavaScript已经在侦听更改事件,然后扰乱单词的顺序,就好像尤达已经键入了它们一样。(或者键入Yoda的?)手动触发更改事件可能会启用“保存”按钮,并且您仍然可能会得到使用sendKeys
会产生的相同文本。如果是这种情况,您可能还希望使用JavaScript启用“保存”按钮:
//设置输入文本
jse.executeScript(“参数[0].value='我正在linux机器上运行';”,visibleElement);
//找到“保存”按钮
WebElement saveButton=driver.findElement(…);
//启用“保存”按钮
jse.executeScript(“参数[0].disabled=false;”,saveButton);
保存按钮。单击();
以元素可见开始并不能保证元素是可交互的,即可点击的,或者您可以直接调用sendKeys()
要在所需元素中调用sendKeys()
,您需要为elementtobelickable()
引入WebDriverWait,并且可以使用以下方法:
您可以在中找到相关的详细讨论
tl;博士
您是否尝试过显式等待和元素可选择
?是的,我尝试过保存
按钮,从视觉上看,该按钮从未启用过。否,我说的是输入字段您是否尝试过显式等待和元素可选择
?然后尝试sendKeys()
Yes也尝试了,但行为相同。如果此链接用于诊断,是否可以共享该链接。尝试了此操作但没有帮助:(我已对其进行了编辑,以便为每个输入的字符单击“主页”按钮。
WebElement clickableElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(visibleElement))
clickableElement.click();
clickableElement.clear();
clickableElement.sendKeys("I am running on linux machine");