【问题标题】:Cannot reach xPath of element using Selenium Java无法使用 Selenium Java 到达元素的 xPath
【发布时间】:2018-04-12 05:10:37
【问题描述】:

我基本上已经尝试了所有可能的方法,但我找不到将密钥发送到以下信用卡字段的方法。我相信这是因为需要先单击该字段,但我什至无法选择该字段来单击它。非常感谢任何帮助。

网站链接:https://givingday.northeastern.edu/pages/giving-page-2

点击前的 HTML:

<form accept-charset="UTF-8" action="javascript:void(0);" id="number-form" onsubmit="return false;">
<label for="card_number" class="visuallyhidden" id="number_label">Card Number</label>
<input type="text" pattern="[0-9]*" name="card_number" id="card_number" autocomplete="off" size="19" style="width: 100%; height: 2.5em; border-radius: 2px; border: 1px solid rgb(226, 226, 226); font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; padding-left: 5%; font-size: 14px; color: rgb(51, 51, 51); box-sizing: border-box;">

点击后的 HTML:

<form accept-charset="UTF-8" action="javascript:void(0);" id="number-form" onsubmit="return false;" _lpchecked="1">
<label for="card_number" class="visuallyhidden" id="number_label">Card Number</label>
<input type="text" pattern="[0-9]*" name="card_number" id="card_number" autocomplete="off" size="19" style="width: 100%; height: 2.5em; border-radius: 2px; border: 1px solid rgb(226, 226, 226); font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; padding-left: 5%; font-size: 14px; color: rgb(51, 51, 51); box-sizing: border-box;">

<pre id="_h#2" style="white-space: pre-wrap; position: absolute; z-index: -9; visibility: hidden; display: block; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 14px; font-weight: 400; font-style: normal; text-transform: none; text-decoration: none solid rgb(51, 51, 51); letter-spacing: normal; word-spacing: 0px; line-height: normal; text-align: start; vertical-align: baseline; direction: ltr; width: 335px; height: 35px; margin: 0px; padding: 1px 1px 1px 16.75px; border-width: 1px; border-style: solid; overflow: auto; left: 0px; top: 0px;"><span>​</span> </pre>

【问题讨论】:

  • 你尝试了什么?发布代码。当你尝试它时发生了什么?有什么例外吗?
  • 它之前和之后的 id 相同,所以你应该完全可以使用它。你的java代码是什么来选择它?你得到什么错误?编辑:这是因为加载覆盖对话框时信用卡字段上有一个小负载轮。您需要先等待它消失和/或等待信用卡字段显示,而不是尝试立即设置它(猜猜这就是发生的事情)
  • 另一件事是,如果您查看页面,您将处于 iframe 中。你需要看看如何处理 iframe...guru99.com/handling-iframes-selenium.html
  • OP 已经问了两次同样的问题,但他没有回复答案 (stackoverflow.com/questions/49784974/…)。另外,请注意 iframe id 是动态的。 @SimonN,您的答案的最后 4 位数字会根据每个请求不断变化。

标签: java selenium selenium-webdriver webdriver


【解决方案1】:

根据我的假设并以最简单的最不可重复使用的方式,您将需要:

driver.switchTo.frame('spreedly-number-frame-9064')
driver.findElement(by.id('card_number')).click

【讨论】:

  • 这是评论,不是答案。
  • 我很确定这是一个答案
  • 也许现在在你编辑了两次之后。原始帖子和第一次编辑不是答案。
【解决方案2】:

信用卡和CVV号码字段在iframe中。打开的提示有2个iframe。

建议:你必须切换到 iframe 才能在其中执行一些操作。

这是解决您的问题的代码:(Java + Selenium)

public class StackOverFlow {

    static WebDriver driver;
    static WebDriverWait wait;

    public static void main(String[] args) throws InterruptedException {


            System.setProperty("webdriver.chrome.driver", "F:\\Automation_Learning\\chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
            wait = new WebDriverWait(driver, 40);
            driver.get("https://givingday.northeastern.edu/pages/giving-page-2");
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".campaign-tiles-content")));
            Thread.sleep(5000);
            scrollDown(driver, "scroll(0,700)");
            driver.findElement(By.xpath("//a[text()='Club Sports']/parent::div/following-sibling::div[@class='inline-b']/descendant::button")).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".giving-form-billing")));
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//h3[text()='Archery']")));
            driver.findElement(By.xpath("//h3[text()='Archery']")).click();
            scrollDown(driver, "scroll(0,500)");
            wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button[class$='secondary-color-background']")));
            driver.findElement(By.cssSelector("button[class$='secondary-color-background']")).click();
            wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector("span[class^='step_credit']"))));
            driver.findElement(By.name("first_name")).sendKeys("abc");
            driver.findElement(By.name("last_name")).sendKeys("xyz");
            driver.findElement(By.name("email")).sendKeys("abcxyz@hotmail.com");
            driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[id^='spreedly-number-frame']")));
            Thread.sleep(5000);
            driver.findElement(By.xpath("//form[@id='number-form']/descendant::input")).sendKeys("12345678");
        }

        public static void scrollDown(WebDriver driver, String YoffSet){
            JavascriptExecutor jse = (JavascriptExecutor)driver;
            jse.executeScript(YoffSet);
        }
}

注意::我面临网络问题,这就是我使用 Thread.sleep(5000); 的原因

如果你愿意,你也可以使用显式等待。

如果您对此有任何疑虑,请告诉我。

【讨论】:

  • @kyle:你试过这个代码吗?它解决了您的问题吗?
【解决方案3】:

试试这个希望这会有所帮助, driver.switchTo().frame(0); wait.until(ExpectedConditions.visibilityOfElementLocated((By.xpath(".//*[@id='card_number']")))); ele.sendKeys("卡号");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2021-01-11
    • 2021-01-02
    相关资源
    最近更新 更多