Python Selenium Chrome Webdriver进程在本地工作,但不在Heroku上工作

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

因此,我有下面的SeleniumChromeWebDriver进程,它在本地正常工作。基本上,当运行下面的代码时,通过百思买进行购买,并从我的Twilio电话号码向我发送一条短信,指示购买是否成功。所有CAP中的变量都已定义。我也没有包括进口。同样,下面的代码在本地运行时使购买成功。这意味着每次在本地运行以下代码时,我从我的Twilio电话号码中收到的SMS消息都包含“Success!”:

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')网站可以在不同的分辨率上有不同的布局
  • 不使用完整的XPath,例如:

  • 而是使用[<角色> > /[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']")))
      
      与:


    谢谢!这是有效的;回溯绝对是一个很好的工具,可以查看异常的确切错误消息;我不熟悉python中的异常处理。顺便说一句,该模块现在被称为traceback2,因此我必须执行“作为traceback导入traceback2”。再次感谢!但主要的问题仍然存在……为什么我远程运行时会出现超时异常,而本地运行时却不会出现超时异常?@watersheep23-当你说超时时,你指的是什么?例如,您是指java世界中的selenium异常
    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']")))