Python Selenium Chrome Webdriver进程在本地工作,但不在Heroku上工作
因此,我有下面的SeleniumChromeWebDriver进程,它在本地正常工作。基本上,当运行下面的代码时,通过百思买进行购买,并从我的Twilio电话号码向我发送一条短信,指示购买是否成功。所有CAP中的变量都已定义。我也没有包括进口。同样,下面的代码在本地运行时使购买成功。这意味着每次在本地运行以下代码时,我从我的Twilio电话号码中收到的SMS消息都包含“Success!”:Python Selenium Chrome Webdriver进程在本地工作,但不在Heroku上工作,python,selenium,heroku,selenium-chromedriver,google-chrome-headless,Python,Selenium,Heroku,Selenium Chromedriver,Google Chrome Headless,因此,我有下面的SeleniumChromeWebDriver进程,它在本地正常工作。基本上,当运行下面的代码时,通过百思买进行购买,并从我的Twilio电话号码向我发送一条短信,指示购买是否成功。所有CAP中的变量都已定义。我也没有包括进口。同样,下面的代码在本地运行时使购买成功。这意味着每次在本地运行以下代码时,我从我的Twilio电话号码中收到的SMS消息都包含“Success!”: client = Client(ACCOUNT_SID, AUTH_TOKEN) def runBestB
client = Client(ACCOUNT_SID, AUTH_TOKEN)
def runBestBuyBotLocal():
driver = webdriver.Chrome()
driver.get("https://www.bestbuy.com/site/spongebob-squarepants-mini-plush-styles-may-vary/6404213.p?skuId=6404213")
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body[@class='size-l']/div[@class='pl-page-content']//div[@class='container-v2']/div[@class='row v-m-bottom-g']/div[2]//div[@class='col-xs-12']/div[6]/div[@class='None']/div/div/div/button[@type='button']")))
element.send_keys(Keys.RETURN)
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//div[@class='c-portal']/div[@role='dialog']/div[1]/div[@role='dialog']/div[@role='document']//a[@role='button']")))
element.send_keys(Keys.RETURN)
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//div[@id='cartApp']/div[@class='page-spinner page-spinner--out']/div[@class='large-view size-l']//div[@class='fluid-large-view']//section[@class='fluid-large-view__sidebar']//button[@type='button']")))
element.send_keys(Keys.RETURN)
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//input[@id='fld-e']")))
element.send_keys(EMAIL)
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//input[@id='fld-p1']")))
element.send_keys(PASSWORD)
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//div[@class='cia-app-container']/div[@class='cia-actual-full-page-wrapper lv']/section/main[@class='cia-wrapper container']//form/div[3]/button")))
element.send_keys(Keys.RETURN)
driver.execute_script("arguments[0].scrollIntoView(true);", WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html//input[@id='credit-card-cvv']"))))
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//input[@id='credit-card-cvv']")))
element.send_keys(CVV)
driver.execute_script("arguments[0].scrollIntoView(true);", WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html//div[@id='checkoutApp']/div[@class='page-spinner page-spinner--out']/div[1]/div[1]//div[@class='checkout__container checkout__container-fast-track']/div[@class='checkout__col checkout__col--primary']//div[@class='button--place-order-fast-track']/button"))))
element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//div[@id='checkoutApp']/div[@class='page-spinner page-spinner--out']/div[1]/div[1]//div[@class='checkout__container checkout__container-fast-track']/div[@class='checkout__col checkout__col--primary']//div[@class='button--place-order-fast-track']/button")))
element.send_keys(Keys.RETURN)
try:
runBestBuyBotLocal()
message = client.messages \
.create(
body='Success!',
from_=TWILIONUMBER,
to=MYNUMBER
)
except:
message = client.messages \
.create(
body='Fail! ' + traceback.format_exc(),
from_=TWILIONUMBER,
to=MYNUMBER
)
下面的代码基本上是相同的过程,但稍微适应了Heroku remote dyno的功能。这是我的Heroku web应用程序的一部分。以下代码在Heroku remote dyno上运行时未成功购买。相反,它在element=wait.until行上抛出超时错误(EC.presence_of_element位于((By.XPATH,“/html//div[@class='c-portal']]/div[@role='dialog']]/div[@role='dialog']/div[@role='document']//a[@role='button']))
这真的很奇怪,因为我在runBestBuyBotLocal
中有同一行,当runBestBuyBotLocal
get在本地执行时,该行上不会抛出超时异常,并且购买成功。
因此,由于引发超时异常,每次我在Heroku remote dyno上运行以下代码时,我都会从我的Twilio电话号码中收到一条短信,其中包含“Fail!”:
因此,问题是:有没有人知道为什么runBestBuyBotLocal
在本地运行时不会引发超时异常,为什么runBestBuyBotRemote
在我的Heroku remote dyno上运行时会引发超时异常?换句话说,为什么当进程在本地运行时,我会收到一条“成功!”短信,而在Heroku remote dyno上运行时,我会收到一条“失败”短信?
我不明白为什么在本地运行时进程会成功,而在Heroku remote dyno上运行时会失败。runBestBuyBoyLocal
和runBestBuyBotRemote
函数之间的唯一区别是webdriver的实例化方式。所以一次失败和一次成功的原因可能是由于这种差异,但我不确定
如果我需要清理任何东西,请告诉我
import traceback
try:
WebDriverWait(driver, 2).until(EC.element_to_be_clickable(
(By.XPATH, '//b[@id = "country_england"]/preceding-sibling::input'))).click()
except:
traceback.print_exc()
使用回溯打印完整的异常跟踪
在我看来,你应该试试:
chrome\u选项。添加参数('window-size=1920x1080')代码>网站可以在不同的分辨率上有不同的布局
而是使用[<角色> > /[Actudio=“按钮']”/代码>,如果DOM中存在多个元素,使用此属性,尝试扩展条件,即“代码>”/[ A'角色=“按钮”,并包含(@ id,'fo')]“< /代码>查找:
您需要考虑以下几件事情:- 启动无头浏览上下文,即打开时显示一个减少的标题。所以你需要最大化
- 例如:
options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument("window-size=1400,900")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body[@class='size-l']/div[@class='pl-page-content']//div[@class='container-v2']/div[@class='row v-m-bottom-g']/div[2]//div[@class='col-xs-12']/div[6]/div[@class='None']/div/div/div/button[@type='button']"))).send_keys(Keys.RETURN)
- 例如:
- 如果您的测试步骤是与元素交互,而不是诱导
- 例如:
options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument("window-size=1400,900")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "/html/body[@class='size-l']/div[@class='pl-page-content']//div[@class='container-v2']/div[@class='row v-m-bottom-g']/div[2]//div[@class='col-xs-12']/div[6]/div[@class='None']/div/div/div/button[@type='button']"))).send_keys(Keys.RETURN)
- 例如:
- 绝对xpath使测试变得脆弱。您可能希望用相对xpath替换它们。例如,替换:
与:element = wait.until(EC.presence_of_element_located((By.XPATH, "/html//div[@id='cartApp']/div[@class='page-spinner page-spinner--out']/div[@class='large-view size-l']//div[@class='fluid-large-view']//section[@class='fluid-large-view__sidebar']//button[@type='button']")))
org.openqa.selenium.TimeoutException
表示等待元素超时。这通常意味着在远程模式下运行时,所讨论的元素似乎根本不出现。您是否尝试过在发生此故障时拍摄UI的屏幕截图。您应该添加逻辑,在操作之前和finally块中截图,以查看UI上发生的情况。是的,这就是我所指的,对于python,它是selenium.common.exceptions.TimeoutException。但问题是,我正在远程Heroku dyno上运行代码,所以当Chrome浏览器试图购买时,我实际上无法看到它在我的计算机上打开。因此,我认为我无法截屏。@PDHide是的,跟踪只是在我在问题中提到的行上显示selenium.common.exceptions.TimeoutExceptions。为什么窗口大小需要最大化?当我在本地运行时,窗口大小并没有最大化,webdriver进程工作正常。
element = wait.until(EC.presence_of_element_located((By.XPATH, "//button[@type='button'][@attribute2='value'][@attribute3='value']")))