如何通过Java/Selenium程序化填充纽约时报填字游戏单元格内容
解决纽约时报填字游戏单元格填充问题
问题背景
用Java/Selenium调用sendKeys()方法填充纽约时报填字游戏单元格时,出现element not interactable: element has zero size错误;尝试JavaScript模拟键盘输入也未生效,需要找到正确的单元格值设置方式。
页面中单个线索的示例元素结构如下:
<!-- 线索编号,此处为3 --> <text x="71.00" y="14.50" text-anchor="start" font-size="11.00"> <text class="xwd__cell--hidden" aria-live="polite"> </text>3 </text> <!-- 对应谜底,此处为N --> <text x="85.50" y="33.25" text-anchor="middle" font-size="22.00"> <text class="xwd__cell--hidden" aria-live="polite">N </text>N </text>
解决方案
方案1:直接用JavaScript修改元素文本并同步状态
页面中的xwd__cell--hidden标签是辅助交互的隐藏元素,页面填字状态可能依赖它的内容。可以同时修改隐藏元素和显示文本的内容,并触发同步事件:
// 定位显示谜底的text元素 WebElement answerText = driver.findElement(By.xpath("//text[@text-anchor='middle' and @font-size='22.00']")); // 定位隐藏的辅助text元素 WebElement hiddenText = answerText.findElement(By.className("xwd__cell--hidden")); JavascriptExecutor js = (JavascriptExecutor) driver; // 修改隐藏元素内容 js.executeScript("arguments[0].textContent = arguments[1];", hiddenText, "目标字母"); // 修改显示文本内容 js.executeScript("arguments[0].textContent = arguments[1];", answerText, "目标字母"); // 触发input事件同步页面状态 js.executeScript("arguments[0].dispatchEvent(new Event('input', { bubbles: true }));", answerText);
方案2:模拟真实焦点与键盘事件
如果直接修改文本不生效,可先让单元格获得焦点,再模拟完整的键盘输入流程:
// 定位单元格的SVG容器(通常是包含text元素的g标签,需根据实际页面调整class) WebElement cellContainer = driver.findElement(By.xpath("//g[contains(@class, 'xwd__cell')]")); // 点击容器获取焦点 cellContainer.click(); JavascriptExecutor js = (JavascriptExecutor) driver; String targetLetter = "目标字母"; // 模拟键盘按下、输入、松开事件 js.executeScript("const evt = new KeyboardEvent('keydown', { key: arguments[0], bubbles: true }); document.activeElement.dispatchEvent(evt);", targetLetter); js.executeScript("const evt = new KeyboardEvent('keypress', { key: arguments[0], bubbles: true }); document.activeElement.dispatchEvent(evt);", targetLetter); js.executeScript("const evt = new KeyboardEvent('keyup', { key: arguments[0], bubbles: true }); document.activeElement.dispatchEvent(evt);", targetLetter);
注意事项
- 纽约时报填字游戏存在反爬机制,操作时需添加合理延迟(如
Thread.sleep(500)),避免触发限制 - 元素定位需根据实际页面结构调整,优先使用通用类名而非硬编码的x/y坐标,保证兼容性
- 部分填字游戏通过光标导航切换单元格,需确保目标单元格处于激活状态后再执行输入操作
内容的提问来源于stack exchange,提问作者Moshe
相关产品推荐
相关产品推荐

