I have the next code for a button, but I can't find it (to click it) with Selenium:
<button class="practice-button btn btn-primary btn-large theme-primary-button">OK, I'm ready! </button>
I've tried with
browser.find_element_by_xpath("//button[#class='practice-button btn btn-primary btn-large theme-primary-button']")
browser.find_element_by_class_name('practice-button btn btn-primary btn-large theme-primary-button')
browser.find_element_by_class_name('practice-button')
but none of them has worked. Can you help me, please?
Here is what I tried for finding a button with given classes and it worked. Depending on the context, there may be more efficient ways to find the button. Feel free to share the url or page code.
xpath
class_name
css_selector
Given the page is as follows:
<!DOCTYPE html>
<body>
<button class="practice-button btn btn-primary btn-large theme-primary-button">OK, I'm ready! </button>
</body>
</html>
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('file:///Users/jabbson/Projects/python/selenium-test/index.html')
button1 = driver.find_element_by_xpath('''//button[contains(#class, 'practice-button') and
contains(#class, 'btn') and
contains(#class, 'btn-primary') and
contains(#class, 'btn-large') and
contains(#class, 'theme-primary-button')]''')
button2 = driver.find_element_by_class_name('practice-button')
button3 = driver.find_element_by_css_selector('button.practice-button')
print('xpath:', button1.text)
print('class_name:', button2.text)
print('css_sel:', button3.text)
outputs:
xpath: OK, I'm ready!
class_name: OK, I'm ready!
css_sel: OK, I'm ready!
Related
I try to find how can I click on button for accept cookies with a python in selenium,
I used a lot of convinations but nothing works :(
This is the element:
<button class="button primary cookie-button" ng-click="$ctrl.allowAllCookies()">
<span class="ng-binding">Todas las cookies</span>
</button>
I used in other with:
wait = WebDriverWait(driver, 5)
time.sleep(2)
wait.until(EC.presence_of_element_located((By.ID, "onetrust-banner-sdk")))
element = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[#id="onetrust-accept-btn-handler"]')))
element.click()
This is all the code from button:
<div class="text-center cookie-controls"> <button class="button primary cookie-button" ng-click="$ctrl.allowCookiesSelection()"> <span class="ng-binding">Permitir selección</span> </button> <button class="button primary cookie-button" ng-click="$ctrl.allowAllCookies()"> <span class="ng-binding">Todas las cookies</span>
But now I don't have id to use and I don't know how can I use.
Accordingly to XML you presenting in the question you can locate this button with several XPath locators.
For example try this:
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(#ng-click,"allowAllCookies")]'))).click()
how to find this button this is code, xpath doesn't work:
<button type="submit" data-module="tooltip" data-tooltip-config="addtocart" data-tooltip-content="#tooltip_addtocart" class="btn btn-orange-normal-plp addToCartClick product-tile__add-to-cart-CTA js--add-to-cart tooltipstered">
<span class="product-tile__add-to-cart-icon icon-cart-white"></span>
</button>
tnx
the relative Xpath to the button you want is:
//button[#type='submit']
I'm learning with Python Selenium and I'm trying to click a button which doesn't seem to have an id. I get an error that the element could not be scrolled into view.
Could anyone help with how I click the element?
It might be useful to know that the button only appears when you mouse over a section of the page
HTML is:
<div class="btn-group" role="group" aria-label="...">
<button type="button" class="grey-bg btn btn-default btn-expand" title="Expand"></button>
<button type="button" class="grey-bg btn btn-default btn-export" title="Export"></button>
<button type="button" class="grey-bg btn btn-default btn-clone" title="Clone"></button>
<button type="button" class="grey-bg btn btn-default btn-stamp" title="Pin"></button>
<button type="button" class="grey-bg btn btn-default btn-delete" title="Delete"></button>
</div>
I've tried to select by xpath:
driver.find_element_by_xpath('//*[#title="Export"]').click()
Thanks!
As you mentioned, it appears when you mouse hover. Kindly refer to this discussion for mouse hover. And try to look for the button after then click using javascript as this doesn't need to be displayed in order to click.
exportBtn = driver.find_element_by_xpath('//*[#title="Export"]') driver.execute_script("arguments[0].click();", exportBtn)
From the error, it looks like the element hasn't been scrolled into view. In order to scroll to the element, just add this line to ur code:
element = driver.find_element_by_xpath('//*[#title="Export"]')
driver.execute_script("arguments[0].scrollIntoView();", element)
element.click()
Hope that this helps!
I was trying to click a popup button and my code shows the error:
"selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable".
I have searched but could not find the solution which works for me with the popup buttons.
Image for clicking show 10 rows and displaying the pop-up boxThe attached image is the desired result and 'Show 10 rows' is behind it and lightly seen.
I have this in my HTML code and need to click on the button.
<div class="table-responsive">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" id="loadsur" href="#Section" aria-expanded="true">LoadSurvey</a></li>
</ul>
<div class="container-fluid">
<div class="row">
<div class="col-md-12" style="margin-left: -10px;">
<div class="table-responsive">
<div id="myDataTable25_wrapper" class="dataTables_wrapper no-footer"><div class="dt-buttons">
<button class="dt-button buttons-csv buttons-html5" tabindex="0" aria-controls="myDataTable25">
<span>Csv</span></button>
<button class="dt-button buttons-excel buttons-html5" tabindex="0" aria-controls="myDataTable25">
<span>Excel</span></button>
<button class="dt-button buttons-collection buttons-page-length" tabindex="0" aria-controls="myDataTable25" aria-haspopup="true">
<span>Show 10 rows</span></button>
</div>
</div>
</div>
</div>
</div>
In Python I tried this:
def single_meter(i=0):
browser=webdriver.Chrome('C:\Webdrivers\chromedriver.exe')
for row in range (5,10):
browser.get('http://#link'+consumer_ID+'?reportrange=21%2F07%2F2018-25%2F08%2F2019')
Show10 = find_element_by_xpath("//button[#class='dt-button buttons-collection buttons-page-length']//span[contains(text(),'Show 10 rows')]")
Show10.click()
I expect to click this button which causes a popup button to appear.
It might be in an iframe.
Try first to find the iframe and switch to it.
browser = webdriver.Chrome()
browser.get("http:/link")
frame_id = 'frame'
wait = WebDriverWait(browser, 10)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, frame_id)))
Then try clicking on the button.
Show10 = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//button[#class='dt-button buttons-collection buttons-page-length']//span[contains(text(),'Show 10 rows')]")))
Show10.click()
I got a solution to this problem. The error was with the link in the xpath. I later copied and pasted from the html and the code now looks this:
Show10 = find_element_by_xpath("//*[#id='myDataTable2_wrapper']/div[1]/button[7]/span")
Show10.click()
And it works fine. Thank all for your help.
Change the xpath with :
//button[#class='dt-button buttons-collection buttons-page-length']//span[contains(text(),'Show 10 rows')]
Try use WebDriverWait for make sure the element exist, and add expected_conditions until the element clickable.
Import this :
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
Try this :
wait = WebDriverWait(singlemeter, 10)
Show10 = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//button[#class='dt-button buttons-collection buttons-page-length']//span[contains(text(),'Show 10 rows')]")))
Show10.click()
Or use ActionChains, import this :
from selenium.webdriver import ActionChains
Try this :
ActionChains(singlemeter).move_to_element(Show10).click(Show10).perform()
There are 2 buttons in a page, and the difference between these 2 buttons is "onclick".
<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('security_div0')">OK</button>
<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('wlan1security_div0')">OK</button>
I was thinking to use xpath:
driver.find_element_by_xpath("//form[#id='update-container-id']/div/div/div/div[2]/div/div[2]/table[1]/tbody/tr[1]/td[8]/div[3]/div/div/div/div[3]/button").click()
But it responses the error as below:
selenium.common.exceptions.ElementNotInteractableException: Message: Element <button id="YesBtn" class="btn btn-primary" type="button"> could not be scrolled into view
Does anyone can help me to click the 2nd button correctly? Thanks a lot.
try with the x-path //button[#onclick="check_security('wlan1security_div0')"]
driver.find_element_by_xpath("//button[#onclick=\"check_security('wlan1security_div0')\"]").click()
Using Action class,
button = driver.find_element_by_xpath("//button[#onclick=\"check_security('wlan1security_div0')\"]")
ActionChains(driver).move_to_element(button).click(button).perform()
using java script executor,
driver.execute_script("javascript:check_security('wlan1security_div0')")
As per the HTML you have provided, to click on the button using the onclick() event you can use the following solution:
First Element(css_selector):
driver.find_element_by_css_selector("button.btn.btn-primary#YesBtn[onclick*='security_div0']").click()
First Element(xpath):
driver.find_element_by_xpath("//button[#class='btn btn-primary' and #id='YesBtn'][#onclick=\"check_security('security_div0')\"]").click()
Second Element(css_selector):
driver.find_element_by_css_selector("button.btn.btn-primary#YesBtn[onclick*='wlan1security_div0']").click()
Second Element(xpath):
driver.find_element_by_xpath("//button[#class='btn btn-primary' and #id='YesBtn'][#onclick=\"check_security('wlan1security_div0')\"]").click()
First and foremost, you are using a really long xpath which will be difficult to maintain. You can narrow it down further.
Now, some xpaths you can try:
1) Get the second button with the id YesBtn (assuming there are only two buttons with that attribute) :
driver.find_element_by_xpath("(//button[#id= 'YesBtn'])[2]");
2) Find by the onclick attribute:
driver.find_element_by_xpath("//button[#onclick= \'check_security(\'wlan1security_div0\')\']");
button1 with HTML :
<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('security_div0')">OK</button>
XPATH :
//button[text()='OK' and #onclick="check_security('security_div0')"]
button2 with HTML :
<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('wlan1security_div0')">OK</button>
HTML:
//button[text()='OK' and #onclick="check_security('wlan1security_div0')"]
try:
buttonVar = browser.find_element_by_css_selector(cssSel)
ActionChains(browser).move_to_element(buttonVar).click(buttonVar ).perform()
except Exception as ex:
print("button not found)
Firefox gives you several option you can use with selenium find_element or elements;
by pressing f12 to bring up the inspector,
use the "pick an item" icon in the left corner to select the item you want to view.
This will highlight the text for that item in the inspector, which you can then right click on to bring up a menu where you select "copy" where there are at least 2 find_element options, css_selecor & xpath.
I personally don't like xpath.
They are sometimes long & unruly to work with but whatever suits your style. In my case css_selector works fine.