Python Selenium 自动填充问题

Posted

技术标签:

【中文标题】Python Selenium 自动填充问题【英文标题】:Python Selenium Autofill issue 【发布时间】:2017-04-24 15:23:01 【问题描述】:

我正在尝试制作一个自动脚本机器人来查找特定项目并将该项目添加到用户购物车等。现在我被抓住了,因为每当代码自动填写用户信息时,电话号码和信用卡号码要么倒退要么混淆。

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# Open chrome web browser and directs to supreme.com

browser = webdriver.Chrome()
browser.get('http://www.supremenewyork.com/shop/all')

# Find specific item 

browser.find_element_by_xpath('//*
[@id="container"]/article[12]/div/a/img').click()
WebDriverWait(browser,10).until(
EC.visibility_of_any_elements_located((By.ID,'size')))


# Select size 

Select = Select(browser.find_element_by_id('size'))
Select.select_by_visible_text("Large")

# Add to cart

browser.find_element_by_xpath('//*[@id="add-remove-buttons"]/input').click()
browser.find_element_by_xpath('//*[@id="cart"]/a[2]').click()


# Input user info

Name = browser.find_element_by_id('order_billing_name')
Name.send_keys("Justin Malik")

Email = browser.find_element_by_id('order_email')
Email.send_keys("xxxxxxxxxx@gmail.com")

Telephone = browser.find_element_by_id('order_tel')
Telephone.send_keys("3334449875")

Billing_address = browser.find_element_by_id('bo')
Billing_address.send_keys("13002 lala land CT")

Billing_zip = browser.find_element_by_id('order_billing_zip')
Billing_zip.send_keys("33579")

Billing_City = browser.find_element_by_id('order_billing_city')
Billing_City.send_keys()

Billing_State = browser.find_element_by_id('order_billing_state')
Billing_State.send_keys("TX")



# Credit info

Credit_number = browser.find_element_by_id('cnb')
Credit_number.send_keys("1234 5698 7588 4444")

Credit_month = browser.find_element_by_id('credit_card_month')
Credit_month.send_keys("07")

Credit_year = browser.find_element_by_id('credit_card_year')
Credit_year.send_keys("2021")

Credit_verif = browser.find_element_by_id('vval')
Credit_verif.send_keys("334")


# Accept Terms & Agreements 

terms = browser.find_element_by_id('order_terms').click()

【问题讨论】:

电话和 CC# 字段是否具有自动格式化功能?我猜他们会这样做,并且过去我遇到过硒输入“太快”的问题。尝试制作一种逐个字符键入并在每个字符之间等待的方法。不是长期解决方案,但可以帮助您调试。 这不起作用 【参考方案1】:

首先删除填充文本,然后发送密钥。使用 ActionChain 类。 试试下面的例子:

from selenium.webdriver.common.action_chains import ActionChains

Telephone_field = browser.find_element_by_id('order_tel')

Creditcard_field = browser.find_element_by_id('cnb')

ActionChains(driver).move_to_element(Telephone_field).click().key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).send_keys("3334449875").perform()

ActionChains(driver).move_to_element(Creditcard_field).click().key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).send_keys("1234 5698 7588 4444").perform()

【讨论】:

你好。一个班轮或仅代码的答案并不是回答问题的最佳方式。请添加一些解释,说明您为什么认为这是一个很好的解决方案。 我添加了评论。 这行得通!.. 你能解释一下为什么我以前给我的数字是随机顺序的吗? .keydown 和 .keyup 是干什么用的? Keydown 将按住一个键。在这里,我用它按住“控制”键,然后发送键“a”。它将选择现有的输入文本。然后向上键将释放“控制”键。然后发送密钥将用给定的文本覆盖它。【参考方案2】:

您可以尝试使用javascript设置每个输入字段的值:

Telephone = browser.find_element_by_id('order_tel')
Credit_number = browser.find_element_by_id('cnb')
browser.execute_script('arguments[0].value="3334449875";', Telephon)
browser.execute_script('arguments[0].value="1234569875884444";', Credit_number)

【讨论】:

我注意到抄送和电话号码文本字段已在文本框中包含 (___) ___-____。您可以在这些行的任何位置放置一个数字,在这种情况下,python 现在如何从左到右开始,因为它可以很好地处理街道地址和邮政编码【参考方案3】:

您使用的是哪种浏览器?您也许可以像这样禁用自动填充:

    ChromeOptions options = new ChromeOptions();
    options.addArguments("--disable-single-click-autofill");
    options.addArguments("--disable-autofill-keyboard-accessory-view[8]");
    driver = new ChromeDriver(options);

或者在开始测试之前尝试设置您自己的个人资料并尝试删除 cookie! 以上摘自here。

如果以上还不够,您也许可以让自动填充工作一次,然后快速删除所有自动填充条目。所以在你输入之前调用清理:

browser.find_element_by_xpath('//*[@id="elementWhichWasAutoFilled"]/input').clear()

【讨论】:

我目前正在上课,但这可能会起作用,因为我注意到它会自动填充我的城市并一直想知道它是如何做到的,即使我在代码中留空了 我正在使用 chrome @Xwris Stoixeia 好的更新了答案,您是否尝试过在输入之前删除 [element.clear()]?

以上是关于Python Selenium 自动填充问题的主要内容,如果未能解决你的问题,请参考以下文章

利用selenium自动抓取淘宝后台运营数据填入表格

selenium webdriver 中数据填错了.浏览器自动停止,手动改完后继续自动执行怎么实

帆软表格填一个值,其他表格自动填充该值

selenium + python自动化测试unittest框架学习随机生成姓名

selenium自动测试页面脚本

如何从用于使用 Selenium 填写表单的 chrome 自动填充框中选择值