'How to locate "pay with PayPal" element using selenium with python?
I have been trying to automate my purchasing of products on Newegg.com and I am using Python with Selenium to do so. I have gotten through shipping, delivery and am at the last stage, which is payment. I am trying to locate the "pay with PayPal" button element but am unable to do so. I have tried everything that I know, xpath, css selector..... 
The output/error that I always get is:
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="buttons-container"]/div/div/div"}
(Session info: chrome=89.0.4389.90)
Please help! Thanks!
Edit: Here are the website 'code' that covers the 'Pay with PayPal' element. I did not share the whole website code as it would leak my info.
<div class="summary-actions"><p class="form-note">By placing your order, you agree to Newegg's<!-- --> <a href="#" title="">Privacy Policy</a> and <a href="#">Terms of Use</a>.</p><button id="btnCreditCard" type="button" class="btn btn-primary btn-wide display-none">Place Order<!-- --> <i class="fa fa-caret-right" aria-label="Next Step"></i></button><div id="zoid-paypal-button-f17e959efc" class="btn-wide"><div id="zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg" class="paypal-buttons paypal-buttons-context-iframe paypal-buttons-label-pay paypal-buttons-layout-vertical" data-paypal-smart-button-version="5.0.211" style="height: 32px; transition: all 0.2s ease-in-out 0s;"><style>
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg {
position: relative;
display: inline-block;
width: 100%;
min-height: 25px;
min-width: 150px;
max-width: 750px;
font-size: 0;
}
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg > iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg > iframe.component-frame {
z-index: 100;
}
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg > iframe.prerender-frame {
transition: opacity .2s linear;
z-index: 200;
}
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg > iframe.visible {
opacity: 1;
}
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg > iframe.invisible {
opacity: 0;
pointer-events: none;
}
#zoid-paypal-buttons-3951bb4696_mdu6mdy6mjg > .smart-menu {
position: absolute;
z-index: 300;
top: 0;
left: 0;
width: 100%;
}
</style><iframe allowtransparency="true" name="__zoid__paypal_buttons__eyJ1aWQiOiJ6b2lkLXBheXBhbC1idXR0b25zLTM5NTFiYjQ2OTZfbWR1Nm1keTZtamciLCJjb250ZXh0IjoiaWZyYW1lIiwidGFnIjoicGF5cGFsLWJ1dHRvbnMiLCJ2ZXJzaW9uIjoiOV8wXzYzIiwiY2hpbGREb21haW4iOiJodHRwczovL3d3dy5wYXlwYWwuY29tIiwicGFyZW50RG9tYWluIjoiaHR0cHM6Ly9zZWN1cmUubmV3ZWdnLmNvbSIsInBhcmVudCI6eyJ0eXBlIjoicGFyZW50IiwiZGlzdGFuY2UiOjB9LCJwcm9wcyI6eyJ0eXBlIjoicmF3IiwidmFsdWUiOiJ7XCJmdW5kaW5nU291cmNlXCI6XCJwYXlwYWxcIixcInN0eWxlXCI6e1wibGFiZWxcIjpcInBheVwiLFwibGF5b3V0XCI6XCJ2ZXJ0aWNhbFwiLFwiY29sb3JcIjpcIndoaXRlXCIsXCJzaGFwZVwiOlwicmVjdFwiLFwidGFnbGluZVwiOmZhbHNlLFwiaGVpZ2h0XCI6MzJ9LFwib25Jbml0XCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCI2MTgxMGQ4N2I2X21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJvbkluaXRcIn19LFwiY3JlYXRlT3JkZXJcIjp7XCJfX3R5cGVfX1wiOlwiY3Jvc3NfZG9tYWluX2Z1bmN0aW9uXCIsXCJfX3ZhbF9fXCI6e1wiaWRcIjpcImM1NTAxZDE5YjZfbWR1Nm1keTZtamdcIixcIm5hbWVcIjpcImNyZWF0ZU9yZGVyXCJ9fSxcIm9uQXBwcm92ZVwiOntcIl9fdHlwZV9fXCI6XCJjcm9zc19kb21haW5fZnVuY3Rpb25cIixcIl9fdmFsX19cIjp7XCJpZFwiOlwiYzhjMmQ4ZDI3Zl9tZHU2bWR5Nm1qZ1wiLFwibmFtZVwiOlwib25BcHByb3ZlXCJ9fSxcIm9uQ2xpY2tcIjp7XCJfX3R5cGVfX1wiOlwiY3Jvc3NfZG9tYWluX2Z1bmN0aW9uXCIsXCJfX3ZhbF9fXCI6e1wiaWRcIjpcImJlYzYwMWJmOTlfbWR1Nm1keTZtamdcIixcIm5hbWVcIjpcIm9uQ2xpY2tcIn19LFwic3RvcmFnZVN0YXRlXCI6e1wiZ2V0XCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCIyNDMzZGNkNTRiX21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJnZXRcIn19LFwic2V0XCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCI5NTY1NmJkYzE4X21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJzZXRcIn19fSxcInNlc3Npb25TdGF0ZVwiOntcImdldFwiOntcIl9fdHlwZV9fXCI6XCJjcm9zc19kb21haW5fZnVuY3Rpb25cIixcIl9fdmFsX19cIjp7XCJpZFwiOlwiYjVjODQ5MzRjOF9tZHU2bWR5Nm1qZ1wiLFwibmFtZVwiOlwiZ2V0XCJ9fSxcInNldFwiOntcIl9fdHlwZV9fXCI6XCJjcm9zc19kb21haW5fZnVuY3Rpb25cIixcIl9fdmFsX19cIjp7XCJpZFwiOlwiZjY1ZjBkNjk1Zl9tZHU2bWR5Nm1qZ1wiLFwibmFtZVwiOlwic2V0XCJ9fX0sXCJjb21wb25lbnRzXCI6W1wiYnV0dG9uc1wiXSxcImxvY2FsZVwiOntcImNvdW50cnlcIjpcIlVTXCIsXCJsYW5nXCI6XCJlblwifSxcImdldFByZXJlbmRlckRldGFpbHNcIjp7XCJfX3R5cGVfX1wiOlwiY3Jvc3NfZG9tYWluX2Z1bmN0aW9uXCIsXCJfX3ZhbF9fXCI6e1wiaWRcIjpcImJlODU4NGRmN2ZfbWR1Nm1keTZtamdcIixcIm5hbWVcIjpcImdldFByZXJlbmRlckRldGFpbHNcIn19LFwiZ2V0UG9wdXBCcmlkZ2VcIjp7XCJfX3R5cGVfX1wiOlwiY3Jvc3NfZG9tYWluX2Z1bmN0aW9uXCIsXCJfX3ZhbF9fXCI6e1wiaWRcIjpcImE4MzI3NDEzZTNfbWR1Nm1keTZtamdcIixcIm5hbWVcIjpcImdldFBvcHVwQnJpZGdlXCJ9fSxcImdldFF1ZXJpZWRFbGlnaWJsZUZ1bmRpbmdcIjp7XCJfX3R5cGVfX1wiOlwiY3Jvc3NfZG9tYWluX2Z1bmN0aW9uXCIsXCJfX3ZhbF9fXCI6e1wiaWRcIjpcIjY1MTJlYjZiOTJfbWR1Nm1keTZtamdcIixcIm5hbWVcIjpcImdldFF1ZXJpZWRFbGlnaWJsZUZ1bmRpbmdcIn19LFwiY2xpZW50SURcIjpcIkFTcFVjdHJPLVZ6eHZlMW51MlhHOG95cUo3VG5LYUZFOW45WjlVRjFYWXY0MTdkc0NKemZ6TG1hYzU5TzkwcHBNS0FzRlRNM0dKcW1CMkN6XCIsXCJlbmFibGVUaHJlZURvbWFpblNlY3VyZVwiOmZhbHNlLFwiY29ycmVsYXRpb25JRFwiOlwiZGJhNTQyZjk0MjNkZFwiLFwic3RvcmFnZUlEXCI6XCJlYzYwOWQyZTA4X21kdTZtZGE2bnRhXCIsXCJzZXNzaW9uSURcIjpcIjBkZjlkMDVjZWRfbWR1Nm1kYTZudGFcIixcImJ1dHRvblNlc3Npb25JRFwiOlwiN2RjYzVjNWVkOV9tZHU2bWR5Nm1qZ1wiLFwiZW52XCI6XCJwcm9kdWN0aW9uXCIsXCJmdW5kaW5nRWxpZ2liaWxpdHlcIjp7XCJwYXlwYWxcIjp7XCJlbGlnaWJsZVwiOnRydWUsXCJ2YXVsdGFibGVcIjpmYWxzZX0sXCJwYXlsYXRlclwiOntcImVsaWdpYmxlXCI6ZmFsc2UsXCJwcm9kdWN0c1wiOntcImZsZXhcIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcInBheUluNFwiOntcImVsaWdpYmxlXCI6ZmFsc2V9fX0sXCJjYXJkXCI6e1wiZWxpZ2libGVcIjpmYWxzZSxcImJyYW5kZWRcIjp0cnVlLFwiaW5zdGFsbG1lbnRzXCI6ZmFsc2UsXCJ2ZW5kb3JzXCI6e1widmlzYVwiOntcImVsaWdpYmxlXCI6dHJ1ZSxcInZhdWx0YWJsZVwiOnRydWV9LFwibWFzdGVyY2FyZFwiOntcImVsaWdpYmxlXCI6dHJ1ZSxcInZhdWx0YWJsZVwiOnRydWV9LFwiYW1leFwiOntcImVsaWdpYmxlXCI6dHJ1ZSxcInZhdWx0YWJsZVwiOnRydWV9LFwiZGlzY292ZXJcIjp7XCJlbGlnaWJsZVwiOmZhbHNlLFwidmF1bHRhYmxlXCI6dHJ1ZX0sXCJoaXBlclwiOntcImVsaWdpYmxlXCI6ZmFsc2UsXCJ2YXVsdGFibGVcIjpmYWxzZX0sXCJlbG9cIjp7XCJlbGlnaWJsZVwiOmZhbHNlLFwidmF1bHRhYmxlXCI6dHJ1ZX0sXCJqY2JcIjp7XCJlbGlnaWJsZVwiOmZhbHNlLFwidmF1bHRhYmxlXCI6dHJ1ZX19fSxcInZlbm1vXCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJpdGF1XCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJjcmVkaXRcIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcInNlcGFcIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcImlkZWFsXCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJiYW5jb250YWN0XCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJnaXJvcGF5XCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJlcHNcIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcInNvZm9ydFwiOntcImVsaWdpYmxlXCI6ZmFsc2V9LFwibXliYW5rXCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJwMjRcIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcInppbXBsZXJcIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcIndlY2hhdHBheVwiOntcImVsaWdpYmxlXCI6ZmFsc2V9LFwicGF5dVwiOntcImVsaWdpYmxlXCI6ZmFsc2V9LFwiYmxpa1wiOntcImVsaWdpYmxlXCI6ZmFsc2V9LFwidHJ1c3RseVwiOntcImVsaWdpYmxlXCI6ZmFsc2V9LFwib3h4b1wiOntcImVsaWdpYmxlXCI6ZmFsc2V9LFwibWF4aW1hXCI6e1wiZWxpZ2libGVcIjpmYWxzZX0sXCJib2xldG9cIjp7XCJlbGlnaWJsZVwiOmZhbHNlfSxcIm1lcmNhZG9wYWdvXCI6e1wiZWxpZ2libGVcIjpmYWxzZX19LFwicGxhdGZvcm1cIjpcImRlc2t0b3BcIixcInJlbWVtYmVyZWRcIjpbXSxcImV4cGVyaW1lbnRcIjp7XCJlbmFibGVWZW5tb1wiOmZhbHNlfSxcImZsb3dcIjpcInB1cmNoYXNlXCIsXCJyZW1lbWJlclwiOntcIl9fdHlwZV9fXCI6XCJjcm9zc19kb21haW5fZnVuY3Rpb25cIixcIl9fdmFsX19cIjp7XCJpZFwiOlwiNTdmMmVkZjc1ZF9tZHU2bWR5Nm1qZ1wiLFwibmFtZVwiOlwicmVtZW1iZXJcIn19LFwiY3VycmVuY3lcIjpcIlVTRFwiLFwiaW50ZW50XCI6XCJhdXRob3JpemVcIixcImNvbW1pdFwiOnRydWUsXCJ2YXVsdFwiOmZhbHNlLFwiZW5hYmxlRnVuZGluZ1wiOltdLFwiZGlzYWJsZUZ1bmRpbmdcIjpbXCJjYXJkXCJdLFwiZGlzYWJsZUNhcmRcIjpbXSxcIm1lcmNoYW50SURcIjpbXSxcImNzcFwiOnt9LFwiZ2V0UGFnZVVybFwiOntcIl9fdHlwZV9fXCI6XCJjcm9zc19kb21haW5fZnVuY3Rpb25cIixcIl9fdmFsX19cIjp7XCJpZFwiOlwiNDY5OGJiMmM1NV9tZHU2bWR5Nm1qZ1wiLFwibmFtZVwiOlwiZ2V0UGFnZVVybFwifX0sXCJkZWJ1Z1wiOmZhbHNlLFwidGVzdFwiOntcImFjdGlvblwiOlwiY2hlY2tvdXRcIn0sXCJzdXBwb3J0c1BvcHVwc1wiOnRydWUsXCJzdXBwb3J0ZWROYXRpdmVCcm93c2VyXCI6ZmFsc2V9In0sImV4cG9ydHMiOiJ7XCJpbml0XCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCJlMjZhNzE4MWJhX21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJnblwifX0sXCJjbG9zZVwiOntcIl9fdHlwZV9fXCI6XCJjcm9zc19kb21haW5fZnVuY3Rpb25cIixcIl9fdmFsX19cIjp7XCJpZFwiOlwiOWM4MWJmNzE1Nl9tZHU2bWR5Nm1qZ1wiLFwibmFtZVwiOlwiY2xvc2U6Om1lbW9pemVkXCJ9fSxcImNoZWNrQ2xvc2VcIjp7XCJfX3R5cGVfX1wiOlwiY3Jvc3NfZG9tYWluX2Z1bmN0aW9uXCIsXCJfX3ZhbF9fXCI6e1wiaWRcIjpcIjhhMDVmMjYxOGNfbWR1Nm1keTZtamdcIixcIm5hbWVcIjpcImNoZWNrQ2xvc2VcIn19LFwicmVzaXplXCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCJlOGQ1NTFlMDg3X21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJ3blwifX0sXCJvbkVycm9yXCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCIyYmIxZjExZmYyX21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJrblwifX0sXCJzaG93XCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCI5YWNhMzVmZjZlX21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJyblwifX0sXCJoaWRlXCI6e1wiX190eXBlX19cIjpcImNyb3NzX2RvbWFpbl9mdW5jdGlvblwiLFwiX192YWxfX1wiOntcImlkXCI6XCJjYTdhN2E3YTQ5X21kdTZtZHk2bWpnXCIsXCJuYW1lXCI6XCJvblwifX19In0=__" title="PayPal" allowpaymentrequest="allowpaymentrequest" scrolling="no" id="jsx-iframe-3396af91bf" class="component-frame visible" style="background-color: transparent; border: none;"></iframe><div id="smart-menu" class="smart-menu"></div><div id="installments-modal" class="installments-modal"></div><iframe name="__detect_close_99df0b0a9c_mdu6mdy6mjg__" style="display: none;"></iframe></div></div><div id="zoid-paypalCredit-button-f17e959efc" class="btn-wide display-none"></div><div id="zoid-paypalPayLater-button-f17e959efc" class="btn-wide display-none"></div><div id="btnNSCC" class="btn-payment display-none"></div></div>
I have tried using xpath but it doesn't work:
driver.find_element_by_xpath('//*[@id="buttons-container"]/div/div/div')
Most probably due to some iFrame thing, I found two iframes and had tried switching to them using the frame's id:
driver.switch_to_frame('jsx-iframe-bc95d24112')
and
driver.switch_to_frame('__detect_close_0cbbd25e4e_mdu6mty6mzu__')
But neither seemed to work too :/ If anyone knows what I'm doing wrong, please do tell! Thanks.
Solution 1:[1]
Which site is this? It would be nice if you provided html code of this page. I assume at least this should work.
driver.find_element_by_xpath("//button[text() = 'Pay with PayPal']")
Update after I saw HTML page code:
driver.find_element_by_id("btnCreditCard").click()
If it is id of a different button, then try:
driver.find_element_by_css_selector(".paypal-buttons.paypal-buttons-context-iframe.paypal-buttons-label-pay.paypal-buttons-layout-vertical").click()
Do not forget to wait till it's loaded.
Solution 2:[2]
Like you supposed, you need to switch on the injected Paypal iFrame.
You can use this kind of CSS selector to switch to the iFrame where the name/id is dynamic (^= operator means starting with) : iframe[name^='__zoid__paypal_buttons__']
Something like that: driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, "iframe[name^='__zoid__paypal_buttons__']"))
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Marius |
