Python Selenium-如何处理不';在WebDriver完成之前不会出现吗?
目前,我正在尝试自动化订单流程,在某个时候,如果最近下了订单,将弹出一个警报,说明“客户已在2天内为这些相同的项目下了订单。请检查重复订单或检查覆盖重复订单以继续。” 我尝试了以下方法来拦截该警报并允许脚本继续运行:Python Selenium-如何处理不';在WebDriver完成之前不会出现吗?,python,selenium,exception,alert,Python,Selenium,Exception,Alert,目前,我正在尝试自动化订单流程,在某个时候,如果最近下了订单,将弹出一个警报,说明“客户已在2天内为这些相同的项目下了订单。请检查重复订单或检查覆盖重复订单以继续。” 我尝试了以下方法来拦截该警报并允许脚本继续运行: from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from seleniu
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support import expected_conditions as ExCon
from selenium.common.exceptions import TimeoutException, NoSuchElementException, NoAlertPresentException,\
UnexpectedAlertPresentException
from oleaprocs import Order
"""
Will put the following constants in their own file later
"""
GEN_NEXT_ID = "cmdNext"
SHIP_DET_METH_ID = "cboAvailItemsShip"
SHIP_DET_NEXT_ID = "cmdNext"
ORDER_REP_ID = "cboServiceRep"
EMAIL_ID = "ctl00_ctl00_main_content_main_content_ctl00_txtEmail"
SEARCH_RESULT_ID = "ctl00_ctl00_main_content_main_content_ctl00_dgResults_ctl03_lnkCustName"
ADD_ORDER_ID = "cmdAddNewOrder"
LOGIN_ID = 'ctl00_ctl00_main_content_main_content_ctl00_UserName'
PASS_ID = 'ctl00_ctl00_main_content_main_content_ctl00_password'
SIGNIN_ID = 'ctl00_ctl00_main_content_main_content_ctl00_SigninBtn'
PLACED_VIA = 'Phone'
BILL_OPTION = 'Visa x1111'
username = 'user'
password = 'pass'
customer = 'user'
items = {'Item1': '100', 'Item2': '125'} # One or many items - also noting quantity
# This setup will likely be steamlined to determine whose server to use, etc
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("website-placeholder-for-security-reasons")
# Login will be separated out into a function, to allow for various logins
# log-in
driver.find_element_by_id(LOGIN_ID).send_keys(username)
driver.find_element_by_id(PASS_ID).send_keys(password)
driver.find_element_by_id(SIGNIN_ID).click()
driver.find_element_by_xpath('//a[text()="Customers"]').click()
# Type in search for user-email - separated to function later
search_email = driver.find_element_by_id(EMAIL_ID)
search_email.send_keys(customer)
search_email.send_keys(Keys.RETURN)
# Click the (hopefully) singular search result
driver.find_element_by_id(SEARCH_RESULT_ID).click()
#search_result = driver.find_element_by_id(SEARCH_RESULT_ID).click()
#search_result.click()
### Start creating new order ###
## Order Items ##
# Accept Customer Orders alert
"""
alert_obj = driver.switch_to.alert
alert_obj.accept()
"""
Alert(driver).accept()
# Click on "Add New Order"
driver.find_element_by_id(ADD_ORDER_ID).click()
order = Order(driver)
# Set Placed Via
placed_via = Select(driver.find_element_by_name('cboPlacedVia'))
placed_via.select_by_visible_text(PLACED_VIA) # could also set IDs in a dict
# Set Billing Option
bill_option = Select(driver.find_element_by_name('ctrlBillOption$cboBillOption'))
bill_option.select_by_visible_text(BILL_OPTION)
# Add items to order
order.add_items(items)
# Will likely do some assertions here at some point, for custom / printed items
driver.find_element_by_id('cmdNext').click()
## Shipping Details ##
# Select Shipping Method
# If similar order recently placed - confirm alert and try/except duplicate order override
# driver.implicitly_wait(2)
try:
print("WebDriverWait - 2 seconds")
WebDriverWait(driver, 2).until(ExCon.alert_is_present())
Alert(driver).accept()
print("Switching to Alert")
#alert_dupe = driver.switch_to.alert
# print(str(alert_dupe.text))
# alert_dupe.accept()
except TimeoutException:
print("Timeout")
except NoAlertPresentException:
print("No Alert Present")
except UnexpectedAlertPresentException:
print("Unexpected alert, yo!")
try:
driver.find_element_by_id('chkDuplicateOrderOverride').click()
except NoSuchElementException:
print("No duplicate order detected")
# Continue
driver.find_element_by_id('cmdNext').click()
## Order Group Details ##
# Check for Authorize button (I could bypass this when I implement "order_type" later
try:
driver.find_element_by_id('cmdAuthorize').click()
except NoSuchElementException:
print("No Authorize Element Found - This payment method does not require authorization")
driver.find_element_by_id('cmdPlaceOrder').click()
以及引用的另一个文件:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
"""
Order will be used to keep track of the state of an order throughout
the order-process. This can include things like the order total, items
included, and can even get as complicated as 1:1 mirroring all of the
details of an order. This will depend on our requirements.
"""
class Order(object):
def __init__(self, driver):
self.driver = driver
# self.product_name_field = self.driver.find_element_by_id('txtProductName')
# self.quantity_field = self.driver.find_element_by_id('txtQuantity')
# self.add_item_button = self.driver.find_element_by_id('cmdAddSaveItem')
# Add items to an order
def add_items(self, items):
"""
Will need to make the quantity check in here.
"""
# product_name_field = self.driver.find_element_by_id('txtProductName')
# quantity_field = self.driver.find_element_by_id('txtQuantity')
# add_item_button = self.driver.find_element_by_id('cmdAddSaveItem')
"""
Cannot simply one-time set the above because of the references
going stale x_x - need to see if I can ignore stale-references.
"""
for item, quantity in items.items():
product_name_field = self.driver.find_element_by_id('txtProductName')
product_name_field.send_keys(item)
product_name_field.send_keys(Keys.TAB)
quantity_field = self.driver.find_element_by_id('txtQuantity')
quantity_field.send_keys(quantity)
quantity_field.send_keys(Keys.TAB)
add_item_button = self.driver.find_element_by_id('cmdAddSaveItem')
add_item_button.click()
我对上一个可能不释放资源的警报发表了评论。。。我早一点就有以下代码来处理总是弹出的警报,所以我不必尝试那一个:
alert_obj = driver.switch_to.alert
alert_obj.accept()
我在这里使用了driver.switch_to.alert
变体,因为我在前面的代码中尝试了这两种变体,但都不起作用
基本上,当代码到达WebDriverWait(drive,2)
时会发生什么。。。浏览器在那里等待2秒钟,然后弹出警报。我已经尝试了各种任意长度的时间,它将始终等待该时间,然后显示警报。我觉得我在这里被人迷住了:|
以下是发生这种情况后我收到的错误信息:
Traceback (most recent call last):
File "C:\Users\user\Documents\Projects\Selenium\proj.py", line 136, in <module>
driver.find_element_by_id('cmdAuthorize').click()
File "C:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 353, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File "C:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 957, in find_element
'value': value})['value']
File "C:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 314, in execute
self.error_handler.check_response(response)
File "C:\Python\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 241, in check_response
raise exception_class(message, screen, stacktrace, alert_text)
selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: None
Message: unexpected alert open: {Alert text : Customer has placed an order for these same items within 2 days. Please check for duplicates or check Override Duplicate Order to continue.}
(Session info: chrome=66.0.3359.181)
(Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 10.0.16299 x86_64)
回溯(最近一次呼叫最后一次):
文件“C:\Users\user\Documents\Projects\Selenium\proj.py”,第136行,在
驱动程序。按\u id('cmdAuthorize')查找\u元素。单击()
文件“C:\Python\lib\site packages\selenium\webdriver\remote\webdriver.py”,第353行,按id查找元素
返回self.find_元素(by=by.ID,value=ID_u)
文件“C:\Python\lib\site packages\selenium\webdriver\remote\webdriver.py”,第957行,位于find\u元素中
'value':value})['value']
文件“C:\Python\lib\site packages\selenium\webdriver\remote\webdriver.py”,第314行,在execute中
self.error\u handler.check\u响应(响应)
文件“C:\Python\lib\site packages\selenium\webdriver\remote\errorhandler.py”,第241行,在check\u响应中
引发异常类(消息、屏幕、堆栈跟踪、警报文本)
selenium.common.exceptions.UnexpectedAlertPresentException:警报文本:无
消息:意外警报打开:{警报文本:客户已在2天内为这些相同的项目下了订单。请检查重复项或检查覆盖重复订单以继续。}
(会话信息:chrome=66.0.3359.181)
(驱动程序信息:chromedriver=2.38.552522(437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),平台=Windows NT 10.0.16299 x8664)
知道为什么会发生这种情况吗?如果我没记错的话,我不相信我们真的有任何警报也有复选框或输入,所以我不会100%反对100%阻止Selenium确认警报(或自动接受警报),但如果可以的话,我希望避免这种情况
如果最近没有下订单(或者我使用不同的帐户在over and over下测试订单的创建),代码运行完全正常,并且一直正确地下订单
从添加项目(就在问题页面之前)开始的手动步骤是:
1) 输入项目名称,然后输入项目数量
2) 对“项目”目录中的每个项目执行此操作
3) 点击下一个按钮
4) 下一页带有装运选项“装载”
5) 如果最近下了订单,则会出现问题—WebDriverWait似乎正在停止加载页面?看起来是这样的,因为在WebDriverWait时间用完之前,警报不会显示
在告诉Selenium点击下一步按钮进入下一页后,我并没有做任何特别的事情。与之前的“点击下一步按钮”操作没有什么不同,页面的行为也不应该与其他页面有任何不同——尽管警报显然没有显示“点击下一步按钮”在警报检查之前——在我尝试先提交装运详细信息之后,警报才会弹出。警报检查失败后似乎继续执行进一步步骤的原因
孩子们,事先概述一下这个过程。你们的代码是驱动程序。按id(“CHKDupplicateOrderOverride”)查找元素。单击()
,但回溯说是驱动程序。按id(“cmdAuthorize”)查找元素。单击()
。。。我遗漏了什么吗?对吗?太奇怪了。所以很明显它。。。只是跳过一堆东西,继续下一段代码,我也不知道为什么会发生这种情况。但它肯定会到此为止,因为在“cmdAuthorize”阶段,我们已经进入下一页,所以它自然会尝试引用一些不存在的内容。由于“自我注释”等原因,目前有点混乱,但如果你认为这会有帮助,我可以发布所有代码。我认为太多的try{}
和catch{}
行为不端。你能用更多的用例(手动步骤)和代码尝试更新这个问题吗?用完整的代码更新&对过程中的手动步骤进行一些解释。有点(我认为)简单,但我们在这里…感谢分享详细的解决方案