【问题标题】:Selenium Java findElement Query not valid for unique ID or XpathSelenium Java findElement 查询对于唯一 ID 或 Xpath 无效
【发布时间】:2016-12-12 15:59:05
【问题描述】:

我正在尝试从here 中选择电子邮件、密码和登录元素。

元素有一个唯一的 ID,我可以通过检查它来复制 Xpath。

我已经尝试了这些查询,但无法弄清楚为什么 Selenium 找不到它。

    WebElement emailfield = driver.findElement(By.id("lid"))

    WebElement emailfield = driver.findElement(By.xpath("//*[@id=\'lid\']"));

    WebElement emailfield = driver.findElement(By.xpath("//*[@id=lid]"));

驱动器能够打开并启动 chrome 来执行此操作。然而,我并不幸运。 请让我知道这些无效的方式。据我了解,id 应该是完全唯一的,但 By.id 和 By.xpath 方法都没有找到元素。

这是我的代码。

    String email = "myemail";
    String password = "the_password";
    WebElement emailfield = driver.findElement(By.id("lid"));
    emailfield.sendKeys(email );
    WebElement passwordfield = driver.findElement(By.xpath("//*[@id=pwd]"));
    passwordfield.sendKeys(password );

    WebElement login = driver.findElement(By.id("submit_but"));
    login.click();

这是 HTML 表格。

  <table width="260" align="center" class="mob_width" cellspacing="2" cellpadding="1">

                    <tbody><tr>
                        <td colspan="2">
                        <h3 class="signintxt">Sign In</h3> 
                        </td>
                    </tr>

                    <tr>
                    <td align="center" colspan="2"><span id="msgpanel"></span></td>
                    </tr>
                    <tr>
                       <td class="label">Email / Phone:</td>
                       <td align="left"><input name="lid" class="input usrbx" id="lid" onkeypress="clearmsg()" type="email" value=""></td>
                    </tr>
                    <tr>
                    <td class="label">Password:</td>
                    <td align="left"><input name="pwd" class="input passbx" id="pwd" onkeypress="clearmsg()" type="password"></td>
                    </tr>

                    <tr>
                    <td class="label"></td>
                    <td align="left"><div class="forgotpasslink"><span onclick="goToForgotPassword();">Forgot Password?</span></div>
                    </td></tr>

                    <tr id="hiptr" style="display: none;">
                                            <td class="label">&nbsp;</td><td align="left">&nbsp;</td>
                    </tr>
                    <tr>
                    <td class="emptytd"></td>
                    <td height="30" class="mobile-height">


                    <div class="sectxt">
                        <label>
                            <input name="rem" id="rem" type="checkbox" value="10">
                            <span class="securetxt">Keep me signed in</span>
                        </label>
                    </div>


                    </td>
                    </tr>
                    <tr>
                    <td class="emptytd"></td>
                    <td align="left">
                        <button name="submit" class="submit_mobile" id="submit_but" type="submit">Sign In</button>


                    </td>
                    </tr>

                </tbody></table>

这是一个编译的显式等待,等待 10 秒并给出相同的错误。

    //explicit
    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement aboutMe;
    aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//form[@id='login']//*[@id='lid']")));
    aboutMe.click();

【问题讨论】:

  • 请发布该元素所在的 HTML 源代码部分。我看不出为什么无法从 Java 源代码中找到它。
  • 查看帖子,我在页面上添加了表格。
  • 你有什么错误吗?
  • 线程“main”中的异常 org.openqa.selenium.NoSuchElementException:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:“.//form[ @id='login']//*[@id='lid']"}
  • 如果我通过 ID 或 Xpath 定位所有元素,它不能定位所有元素。我认为这可能是因为我刚刚下载了 selenium,但它至少打开了驱动程序并能够转到一个页面。

标签: java html xml selenium xpath


【解决方案1】:

这些字段位于&lt;iframe&gt; 内。你需要先切换到它

driver.switchTo.frame("zohoiam"); // switch by iframe ID

WebElement emailfield = driver.findElement(By.id("lid"));
// some more code

driver.switchTo().defaultContent(); // switch out of the iframe

更多开关选项请看here。

【讨论】:

  • 嘿!这在这里工作。我没有抓住这一点,也没有意识到这是一个问题。你怎么知道?
  • @JakeGoss-Kuehn 右键单击​​该字段并从菜单中选择“检查”,它将打开包含该元素的 html 树。从那里您可以向上移动 html 树并看到有一个 &lt;iframe&gt; 标记。
【解决方案2】:

您在编写 xpath 时犯了语法错误,

//*[@id=\'lid\'] 

语法错误[您可以使用 firebug 和 firepath 进行验证]。

试试下面的 xpath 应该可以工作,

.//*[@id='lid']

但是您可以添加父表单节点以使其更加健壮,

.//form[@id='login']//*[@id='lid']

最后,您需要确保等到页面完全加载后再进行元素识别。

有关显式等待的更多信息,请参阅Selenium webdriver explicit wait

【讨论】:

  • 我已经在超时前等待了 10 秒,但这三个解决方案中没有一个有效。 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  • 你应该去显式等待而不是隐式等待。在进行下一步操作之前,请提供一些条件进行检查。我已经参考明确的等待更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多