- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 PeopleSoft 页面,正在尝试使用 Java 的 Selenium Web 驱动程序进行测试。但是,我一直遇到这个错误:
org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
我已阅读 here 、 here 和 here 以及其他 Stack Overflow 问题,但没有一个答案对我有用。
我正在测试的PeopleSoft页面是一个I9表单,我关心的部分如下所示:
相应的 HTML 确实又大又乱——就像所有 PeopleSoft 页面一样——中间有一个 iframe
,它几乎包裹了整个整个 页。
作为引用,此 JSFiddle 包含该 iframe
内的所有 HTML。
这是与上图中的部分相对应的部分:
<table role='presentation' border='0' id='ACE_width' cellpadding='0' cellspacing='0' class='PSPAGECONTAINER' cols='46' width='963'>
<!-- OMITTED -->
<tr>
<td height='16'></td>
<td colspan='19' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_LAST_NAMElbl'>
<label for='G_FORM_I9_G_LAST_NAME' id='G_FORM_I9_G_LAST_NAME_LBL' class='PSEDITBOXLABEL'>*Last Name (Family Name)</label>
</DIV>
</td>
<td colspan='9' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_FIRST_NAMElbl'>
<label for='G_FORM_I9_G_FIRST_NAME' id='G_FORM_I9_G_FIRST_NAME_LBL' class='PSEDITBOXLABEL'>*First Name (Given Name)</label>
</DIV>
</td>
<td colspan='3' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_MIDDLE_INITIALlbl'>
<label for='G_FORM_I9_G_MIDDLE_INITIAL' id='G_FORM_I9_G_MIDDLE_INITIAL_LBL' class='PSEDITBOXLABEL'>Middle Initial</label>
</DIV>
</td>
<td colspan='14' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_MAIDEN_NAMElbl'>
<label for='G_FORM_I9_G_MAIDEN_NAME' id='G_FORM_I9_G_MAIDEN_NAME_LBL' class='PSEDITBOXLABEL'>Other Last Names Used (if any)</label>
</DIV>
</td>
</tr>
<tr>
<td height='32' colspan='2'></td>
<td colspan='19' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_LAST_NAME'>
<input type='text' name='G_FORM_I9_G_LAST_NAME' id='G_FORM_I9_G_LAST_NAME' tabindex='43' value="Tiger" class='PSEDITBOX' style='width:232px; ' maxlength='30' onchange="addchg_win0(this);oChange_win0=this;" aria-required='true' />
</DIV>
</td>
<td colspan='9' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_FIRST_NAME'>
<input type='text' name='G_FORM_I9_G_FIRST_NAME' id='G_FORM_I9_G_FIRST_NAME' tabindex='44' value="Tony" class='PSEDITBOX' style='width:160px; ' maxlength='30' onchange="addchg_win0(this);oChange_win0=this;" aria-required='true' />
</DIV>
</td>
<td colspan='2' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_MIDDLE_INITIAL'>
<input type='text' name='G_FORM_I9_G_MIDDLE_INITIAL' id='G_FORM_I9_G_MIDDLE_INITIAL' tabindex='45' value="" class='PSEDITBOX' style='width:19px; ' maxlength='1' onchange="addchg_win0(this);return doEdits_win0(this,'','N','N','N','N','Y','N',0);"
/>
</DIV>
</td>
<td colspan='14' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_MAIDEN_NAME'>
<input type='text' name='G_FORM_I9_G_MAIDEN_NAME' id='G_FORM_I9_G_MAIDEN_NAME' tabindex='46' value="" class='PSEDITBOX' style='width:180px; ' maxlength='50' />
</DIV>
</td>
</tr>
<tr>
<td height='16'></td>
<td colspan='21' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_ADDRESSlbl'>
<label for='G_FORM_I9_G_ADDRESS' id='G_FORM_I9_G_ADDRESS_LBL' class='PSEDITBOXLABEL'>*Address (Street Number and Name)</label>
</DIV>
</td>
<td colspan='5' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_APARTMENT_NBRlbl'>
<label for='G_FORM_I9_G_APARTMENT_NBR' id='G_FORM_I9_G_APARTMENT_NBR_LBL' class='PSEDITBOXLABEL'>Apt. Number</label>
</DIV>
</td>
<td colspan='7' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_CITYlbl'>
<label for='G_FORM_I9_G_CITY' id='G_FORM_I9_G_CITY_LBL' class='PSEDITBOXLABEL'>*City or Town</label>
</DIV>
</td>
<td colspan='6' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_STATElbl'>
<label for='G_FORM_I9_G_STATE' id='G_FORM_I9_G_STATE_LBL' class='PSEDITBOXLABEL'>*State</label>
</DIV>
</td>
<td colspan='6' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_POSTALlbl'>
<label for='G_FORM_I9_G_POSTAL' id='G_FORM_I9_G_POSTAL_LBL' class='PSEDITBOXLABEL'>*Zip Code</label>
</DIV>
</td>
</tr>
<tr>
<td height='32' colspan='2'></td>
<td colspan='20' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_ADDRESS'>
<input type='text' name='G_FORM_I9_G_ADDRESS' id='G_FORM_I9_G_ADDRESS' tabindex='47' value="" class='PSEDITBOX' style='width:324px; ' maxlength='50' aria-required='true' />
</DIV>
</td>
<td colspan='6' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_APARTMENT_NBR'>
<input type='text' name='G_FORM_I9_G_APARTMENT_NBR' id='G_FORM_I9_G_APARTMENT_NBR' tabindex='48' value="" class='PSEDITBOX' style='width:81px; ' maxlength='10' />
</DIV>
</td>
<td colspan='8' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_CITY'>
<input type='text' name='G_FORM_I9_G_CITY' id='G_FORM_I9_G_CITY' tabindex='49' value="" class='PSEDITBOX' style='width:120px; ' maxlength='30' aria-required='true' />
</DIV>
</td>
<td colspan='5' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_STATE'>
<input type='text' name='G_FORM_I9_G_STATE' id='G_FORM_I9_G_STATE' tabindex='50' value="" class='PSEDITBOX' style='width:53px; ' maxlength='6' onchange="addchg_win0(this);oChange_win0=this;" aria-required='true' />
<a class='PSHYPERLINK' name='G_FORM_I9_G_STATE$prompt' id='G_FORM_I9_G_STATE$prompt' tabindex='51' href="javascript:pAction_win0(document.win0,'G_FORM_I9_G_STATE$prompt');">
<img src="/cs/ps/cache2/PT_PROMPT_LOOKUP_1.gif" alt='Look up State (Alt+5)' title='Look up State (Alt+5)' border='0' align='absmiddle' />
</a>
</DIV>
</td>
<td colspan='5' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_POSTAL'>
<input type='text' name='G_FORM_I9_G_POSTAL' id='G_FORM_I9_G_POSTAL' tabindex='52' value="" class='PSEDITBOX' style='width:80px; ' maxlength='12' onchange="addchg_win0(this);oChange_win0=this;" aria-required='true' />
</DIV>
</td>
</tr>
<tr>
<td height='16'></td>
<td colspan='9' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_BIRTHDATElbl'>
<label for='G_FORM_I9_G_BIRTHDATE' id='G_FORM_I9_G_BIRTHDATE_LBL' class='PSEDITBOXLABEL'>*Date of Birth (mm/dd/yyyy)</label>
</DIV>
</td>
<td colspan='13' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_SSNlbl'>
<label for='G_FORM_I9_G_SSN' id='G_FORM_I9_G_SSN_LBL' class='PSEDITBOXLABEL'>*U.S. Social Security Number</label>
</DIV>
</td>
<td colspan='14' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_EMAILIDlbl'>
<label for='G_FORM_I9_G_EMAILID' id='G_FORM_I9_G_EMAILID_LBL' class='PSEDITBOXLABEL'>Employee's E-mail Address</label>
</DIV>
</td>
<td colspan='9' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_PHONElbl'>
<label for='G_FORM_I9_G_PHONE' id='G_FORM_I9_G_PHONE_LBL' class='PSEDITBOXLABEL'>Employee's Telephone Number</label>
</DIV>
</td>
</tr>
<tr>
<td height='9' colspan='2'></td>
<td colspan='9' rowspan='2' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_BIRTHDATE'>
<input type='text' name='G_FORM_I9_G_BIRTHDATE' id='G_FORM_I9_G_BIRTHDATE' tabindex='53' value="05/05/1955" class='PSEDITBOX' style='width:71px; ' maxlength='10' onchange="addchg_win0(this);return doEdits_win0(this,'DMDY/450','N','N','N','N','N','N',0);"
onkeyup="if (isPromptKey(event))DatePrompt_win0('G_FORM_I9_G_BIRTHDATE','G_FORM_I9_G_BIRTHDATE','450',false);return false;" aria-required='true' />
<a class='PSHYPERLINK' name='G_FORM_I9_G_BIRTHDATE$prompt' id='G_FORM_I9_G_BIRTHDATE$prompt' tabindex='54' onfocus='doFocus_win0(this,true,false);' href="javascript:DatePrompt_win0('G_FORM_I9_G_BIRTHDATE','G_FORM_I9_G_BIRTHDATE$prompt','450',false);">
<img src="/cs/ps/cache2/PT_CALENDAR_1.gif" alt='Choose a date (Alt+5)' title='Choose a date (Alt+5)' border='0' align='absmiddle' />
</a>
</DIV>
</td>
<td colspan='6' rowspan='2' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_SSN'>
<input type='password' name='G_FORM_I9_G_SSN' id='G_FORM_I9_G_SSN' tabindex='55' value="888881125" class='PSEDITBOX' style='width:74px; ' maxlength='9' onchange="addchg_win0(this);oChange_win0=this;" aria-required='true' />
</DIV>
</td>
<td colspan='6'></td>
<td colspan='16' rowspan='2' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_EMAILID'>
<input type='text' name='G_FORM_I9_G_EMAILID' id='G_FORM_I9_G_EMAILID' tabindex='58' value="" class='PSEDITBOX' style='width:232px; ' maxlength='60' />
</DIV>
</td>
<td colspan='7' rowspan='2' nowrap='nowrap' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_PHONE'>
<input type='text' name='G_FORM_I9_G_PHONE' id='G_FORM_I9_G_PHONE' tabindex='59' value="" class='PSEDITBOX' style='width:179px; ' maxlength='24' onchange="addchg_win0(this);oChange_win0=this;" />
</DIV>
</td>
</tr>
<tr>
<td height='23' colspan='2'></td>
<td colspan='6' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_DRV_G_SSN'><span id='G_FORM_I9_DRV_G_SSN$span' onMouseOver="MOpopupObj_win0.StartPopup('win0divG_FORM_I9_DRV_G_SSN', 'G_FORM_I9_DRV_G_SSN_G_POPUP_SSN', 406, 90);" onMouseOut="MOpopupObj_win0.StopPopup(); " class='PSHYPERLINK' style='border-bottom:1px dashed black;padding-bottom:1px;display:inline-block;'><a name='G_FORM_I9_DRV_G_SSN' id='G_FORM_I9_DRV_G_SSN' ptlinktgt='pt_peoplecode' tabindex='56' onclick='javascript:cancelBubble(event);' href="javascript:submitAction_win0(document.win0,'G_FORM_I9_DRV_G_SSN');" class='PSHYPERLINK' >View</a></span>
</DIV>
<div id="G_FORM_I9_DRV_G_SSN_G_POPUP_SSN" style="visibility:hidden; position:absolute; top:0; left:0;">
<DIV class='ps_pspagecontainer' id='win0divPSPAGECONTAINER_G_POPUP_SSN'>
<table role='presentation' border='0' id='ACE_width' cellpadding='0' cellspacing='0' class='PSPAGECONTAINER' cols='2' width='379'>
<tr>
<td width='16' height='8'></td>
<td width='363'></td>
</tr>
<tr>
<td height='56'></td>
<td valign='top' align='left'>
<DIV id='win0divG_FORM_I9_'>
<table role='presentation' border='0' id='ACE_G_FORM_I9_' cellpadding='0' cellspacing='0' cols='3' width='363' class='PAGROUPBOXLABELINVISIBLE' style='border-style:none'>
<tr>
<td width='36' height='10'></td>
<td width='121'></td>
<td width='206'></td>
</tr>
<tr>
<td height='1'></td>
<td rowspan='2' valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_SSN$9$lbl'><span class='PSEDITBOXLABEL'>Social Security #</span>
</DIV>
</td>
</tr>
<tr>
<td height='27'></td>
<td valign='top' align='left'>
<DIV id='win0divG_FORM_I9_G_SSN$9$'><span class='PSEDITBOX_DISPONLY' id='G_FORM_I9_G_SSN$9$'>888881125</span>
</DIV>
</td>
</tr>
</table>
</DIV>
</td>
</tr>
<tr>
<td height='8' colspan='2'></td>
</tr>
</table>
</DIV>
</DIV>
</td>
</tr>
<!-- OMITTED -->
</table>
现在,我正在尝试将数据输入到此表单中,但我不断收到上述异常。当我访问此页面时,我首先通过 SSO 页面来验证我的身份。然后它会将我重定向到表单。那里没有问题。这是我执行此操作的代码(请注意,data
是一个包含数据的 POJO,driver
是一个 ChromeWebDriver
)。
driver.switchTo().frame("TargetContent");
driver.findElement(By.id("G_FORM_I9_G_LAST_NAME")).clear();
driver.findElement(By.id("G_FORM_I9_G_LAST_NAME")).sendKeys(data.lastName, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_FIRST_NAME")).clear();
driver.findElement(By.id("G_FORM_I9_G_FIRST_NAME")).sendKeys(data.firstName, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_ADDRESS")).clear();
driver.findElement(By.id("G_FORM_I9_G_ADDRESS")).sendKeys(data.address, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_CITY")).clear();
driver.findElement(By.id("G_FORM_I9_G_CITY")).sendKeys(data.city, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_STATE")).clear();
driver.findElement(By.id("G_FORM_I9_G_STATE")).sendKeys(data.state, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_POSTAL")).clear();
driver.findElement(By.id("G_FORM_I9_G_POSTAL")).sendKeys(data.postal, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_EMAILID")).clear();
driver.findElement(By.id("G_FORM_I9_G_EMAILID")).sendKeys(data.email, Keys.TAB);
driver.findElement(By.id("G_FORM_I9_G_CITIZEN_CHK")).click();
driver.findElement(By.id("G_FORM_I9_DRV_G_EE_SIGNATURE_PB")).click();
在整个过程中,我在不同的地方都遇到了错误。有时它会在尝试将文本放入的第一个字段失败,有时在第二个字段,有时在后面的字段失败。
为了解决这个问题,我尝试调用这个方法:
private void waitForLoad(WebDriver driver)
{
new WebDriverWait(driver, 30)
.until((ExpectedCondition<Boolean>) wd -> ((JavascriptExecutor) wd)
.executeScript("return document.readyState").equals("complete"));
}
我也尝试过这个:
new WebDriverWait(driver, 5).until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//*[starts-with(@id, \"G_FORM_I9_\")]")));
我错过了什么?我还需要检查什么来确保这些字段实际上可以访问?我曾多次尝试在 IntelliJ 中对此进行调试,但我怀疑在断点处停止的行为会加载页面,因此我从未看到该错误,因为没有元素是过时的。
最佳答案
看起来有时调用 clear()
会更改您的元素引用,并且在页面更新时,您尝试再次定位该元素并找到旧的引用,这会导致 当您
。sendKeys()
时,StaleElementReferenceException
如果您已经知道出现问题的字段,则可以尝试以下操作:
WebDriverWait wait = new WebDriverWait (driver, 30);
WebElement element = driver.findElement(By.id("G_FORM_I9_G_LAST_NAME"));
element.clear();
wait.until(ExpectedConditions.stalenessOf(element));
driver.findElement(By.id("G_FORM_I9_G_LAST_NAME")).sendKeys(data.lastName, Keys.TAB);
但是,如果您不知道哪些字段导致了问题,并且该元素没有变得过时,您将收到 TimeoutException
。
关于java - 如何确保所有字段都加载到 selenium 中的页面上,以便没有一个字段过时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494938/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!