使用Selenium Webdriver与Stripe Card Element iFrame交互-黄瓜/ Selenium Java

Fab*_*llo 4 html iframe cucumber stripe-payments selenium-webdriver

我有一个要在Java中使用Cucumber和Selenium Webdriver自动化的表单-在此表单中,我们有一个从Stripe使用的card元素。我们称为div,其余部分由Stripe完成。我不确定这是否是iFrame,但是当我使用

Hooks.driver.findElement(By.xpath("xpathOfTheCardNumberField")).sendKeys("123");
Run Code Online (Sandbox Code Playgroud)

命令,它将不与之交互,并在控制台日志中返回“无法定位元素”错误。

我已经要求我们的前端程序尝试在字段中添加一些ID或名称标签,但是他告诉我,他不能与card元素内部的字段的标记进行交互,只能与card元素本身进行交互-作为Stripe Deal与其他一切。

随附的是卡片元素的图片,以及相关卡片元素的标记。

是否可以让Selenium与该元素进行交互?

任何帮助是极大的赞赏。卡元素前端

标记卡片元素

小智 5

为确保完整性,对Fabio接受的答案进行了其他后续跟踪。

self.browser = webdriver.Chrome()

# fill in the other fields as usual (i.e. self.browser.find_element_by_id(...))

# When you arrive at the iframe for the card number, exp. date, CVC, and zip:
self.browser.switch_to.frame(frame_reference=self.browser.find_element(By.XPATH, '//iframe[@name="__privateStripeFrame3"]'))

# This switches to the iframe, which Selenium can now start selecting elements from.

# The remaining form elements can be found by name

self.browser.find_element_by_name('cardnumber').send_keys('4242 4242 4242 4242')

# And find the other elements the same way as above (exp-date, cvc, postal).
# Finally, switch back to the default content to select the submit button

self.browser.switch_to.default_content()
self.browser.find_element_by_tag_name('button').click()
Run Code Online (Sandbox Code Playgroud)


Fab*_*llo 3

实际上我自己已经解决了这个问题,所以我将回答这个问题并关闭它,以防其他人遇到问题。

我认为这是一个可以用于任何 iframe 的总方法,而不仅仅是 Stripe。

首先,您必须告诉您的网络驱动程序将框架切换到您尝试访问的 iframe:

Hooks.driver.switchTo().frame(Hooks.driver.findElement(By.xpath("xpathOfIframe")));
Run Code Online (Sandbox Code Playgroud)

然后,您可以为该 iframe 中的内容创建 webElements,并与它们交互:

WebElement creditcardNumber = Hooks.driver.findElement(By.name("cardnumber"));
creditcardNumber.sendKeys("1234567890000066");
Run Code Online (Sandbox Code Playgroud)