Selenium测试记事本App时sendKeys输入'i'显示'ı'问题求助
问题解决:Selenium测试记事本输入字符不一致及关闭不保存操作
一、输入"iii"变为"ııı"的原因与解决方法
这个问题的核心是系统当前输入法/键盘布局为土耳其语(或其他特殊布局),这类布局中小写字母i对应的输入字符是无点的ı。以下是几种可行的解决方式:
1. 切换至英文键盘布局后输入
在调用sendKeys前,通过系统快捷键切换到英文键盘(Windows下按Win + Space),代码中添加这一步:
// 切换到英文键盘布局 np.textArea().sendKeys(Keys.chord(Keys.WINDOWS, Keys.SPACE)); // 执行输入操作 np.textArea().sendKeys("iii");
2. 使用Actions类模拟输入(更稳定)
直接用sendKeys易受输入法干扰,改用Actions类逐个输入字符:
Actions actions = new Actions(driver); actions.sendKeys(np.textArea(), "iii").perform();
3. 启动驱动时指定英文键盘布局
使用WinAppDriver时,可在启动配置中指定英文布局,从根源避免问题:
DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("app", "notepad.exe"); // 指定区域为英文(美国) capabilities.setCapability("locale", "en-US"); // 英文键盘LCID值 capabilities.setCapability("keyboardLayout", "00000409"); driver = new WindowsDriver(new URL("http://127.0.0.1:4723"), capabilities);
二、优化关闭不保存的操作逻辑
原代码的关闭流程可简化,同时需确保弹窗元素定位准确:
1. 修正弹窗元素定位
确认弹窗按钮的定位逻辑,适配中文系统的示例:
// 定位"不保存"按钮 public WebElement dialogDontSave(){ return driver.findElementByName("不保存"); // 英文系统改为"Don't Save" }
2. 简化关闭流程
无需重复按Alt+F4,直接关闭后点击"不保存"即可:
@Test public void testNotepad(){ System.out.println("test"); // 执行输入操作(采用上述任一解决输入问题的方法) Actions actions = new Actions(driver); actions.sendKeys(np.textArea(), "iii").perform(); // 注意:记事本Edit控件需用getAttribute("Value")获取文本,而非getText() Assert.assertEquals(np.textArea().getAttribute("Value"), "iii"); // 关闭记事本并选择不保存 np.textArea().sendKeys(Keys.chord(Keys.ALT, Keys.F4)); np.dialogDontSave().click(); }
关键提示:记事本的
Edit控件无法通过getText()正确获取内容,必须用getAttribute("Value"),这也是可能导致断言失败的潜在原因。
三、完整测试代码示例
import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.winium.DesiredCapabilities; import org.openqa.selenium.winium.WindowsDriver; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.net.URL; public class NotepadTest { private WindowsDriver driver; private NotepadPage np; @BeforeTest public void setup() throws Exception { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("app", "notepad.exe"); capabilities.setCapability("locale", "en-US"); capabilities.setCapability("keyboardLayout", "00000409"); driver = new WindowsDriver(new URL("http://127.0.0.1:4723"), capabilities); np = new NotepadPage(driver); } @Test public void testNotepad(){ System.out.println("test"); // 使用Actions类执行输入 Actions actions = new Actions(driver); actions.sendKeys(np.textArea(), "iii").perform(); // 用Value属性断言文本内容 Assert.assertEquals(np.textArea().getAttribute("Value"), "iii"); // 关闭记事本并选择不保存 np.textArea().sendKeys(Keys.chord(Keys.ALT, Keys.F4)); np.dialogDontSave().click(); } @AfterTest public void teardown(){ if(driver != null){ driver.quit(); } } } class NotepadPage { private WindowsDriver driver; public NotepadPage(WindowsDriver driver){ this.driver = driver; } public WebElement textArea(){ return driver.findElementByClassName("Edit"); } public WebElement dialogDontSave(){ return driver.findElementByName("不保存"); // 英文系统替换为"Don't Save" } }
内容的提问来源于stack exchange,提问作者Kamuransylmz
相关产品推荐
相关产品推荐

