Selenium not clicking element - python

I have the following checkbox element:
<input checked="checked" class="iceSelBoolChkbx"
id="mainContentId:newSerchCheckBox" name="mainContentId:newSerchCheckBox"
onblur="setFocus('');"
onclick="var form=formOf(this);iceSubmitPartial(form, this, event);"
onfocus="setFocus(this.id);"
onkeypress="var form = formOf(this);
Ice.util.radioCheckboxEnter(form,this,event);"
type="checkbox">
I currently am locating the element and attempting to click it using
check_box = driver.find_element_by_id('mainContentId:newSerchCheckBox')
check_box.click()
When I run the code it runs without any errors but on the site the checkbox is still unchecked. What could be causing this and is their an alternative way to check the box?

Try replacing click with mousedown, I don't know what the underlying difference is but it resolved the issue I was having with click().
driver.execute_script('$("#mainContentId:newSerchCheckBox").trigger("mousedown")')
Let me know if you're thrown an error and we can re-write it in pure Javascript rather than relying on jQuery.

I think your checkbox is already selected if you see the input tag checked="checked".So you need to check first whether selected or not.If selected do not click.
element=driver.find_element_by_id("mainContentId:newSerchCheckBox")
if element.is_selected():
print('Check box is already selected')
else:
element.click()

Related

Is there a way I can modify some lines in site html code so it marks the checkbox?

So, there's a site I'm trying to parse so it can automatically raising my offers every two hours.
The site designed in that way that you have to mark with checkboxes the lots you want to raise.
Somehow in html code the checkbox doesn't have value, instead it looks like this:
I have to click it manually via using
wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "idk what to write so it checks it"))).click()
But I really don't know how do I find it so it can be clicked.
<label>
<input type="checkbox" value="613" checked="">
# value - lot id, checked - means the checkbox is marked
<label>
# and non-checked checkbox code looks like this:
<label>
<input type="checkbox" value="613">
<label>
You can't use By.CLASS_NAME here since it has no class.
You can use:
By.CSS_SELECTOR to find by CSS selectors
chbVal = '613' # in case you need be able to change this
(By.CSS_SELECTOR, f'label > input[type="checkbox"][value="{chbVal}"][checked=""]') # for checked
(By.CSS_SELECTOR, f'label > input[type="checkbox"][value="{chbVal}"]:not([checked])') # for unchecked
or By.XPATH to find by Xpath
chbVal = '613' # in case you need be able to change this
(By.XPATH, f'//label/input[#type="checkbox"][#value="{chbVal}"][#checked=""]') # for checked
(By.XPATH, f'//label/input[#type="checkbox"][#value="{chbVal}"][not(#checked="")]') # for unchecked
Note: These are just based on the html snippet you've included - there might by parent elements with better identifiers that you need to include in your path/selector.
Also,
Somehow in html code the checkbox doesn't have value
but in your snippet it does have value...? Anyway, the examples above include value, but you don't have to include them; you can even exclude them with not(...) as shown for checked. (Btw, not(checked)/not(#checked) should exclude elements that have a checked attribute at all, no matter what the value is.)

How to let selenium edit an element

I currently am writing a script for web automation but I want the program to edit an element for me here's a sample of the code I'm using
final = driver.find_element(By.XPATH,"//button[contains(text(),'Change profile name')]")
final.click()
now it won't click it since the website has the element set it false so I want selenium to edit and make the element true so it can click it, is that possible by any chance and if so can anyone explain and thanks!
Heres what the elements HTML look like
button class="btn btn-disabled" type="submit" data-testid="ChangeNameButton" aria-describedby="changeNameFormError" aria-disabled="true" data-bi-type="button">Change profile name
so instead of btn disabled, I want it to change it to enabled then click it and thanks in advance for any help submitted :)
The button you are trying to click is disabled and you can enable it with JS.
Something like this:
final = driver.find_element(By.XPATH,"//button[contains(text(),'Change profile name')]")
driver.execute_script("arguments[0].setAttribute('className', 'btn-enabled');", final)
To change the text of an element do something like the following:
driver.execute_script("document.getElementById('theelement').innerHTML = 'changed text';");
To change or set attribute of element:
element = driver.find_element_by_class_name("NAMEOFELEMENT");
driver.execute_script("arguments[0].setAttribute('color: blue;')", element);

Cannot locate element using Selenium

I am using Selenium with Python and Chromedriver to click on a "button" (not actually a button in the HTML, but looks like one on screen and is clickable). The HTML is below, I am trying to click on the one with the 'button-new' id.
<td class="read" colspan="4">
Read
<a id="button-new" title="Read new record from database" class="button button-new">New</a>
</td>
I have tried using:
new_button = driver.find_element_by_id("button-new")
new_button = driver.find_element_by_css_selector("A.button.button-new")
new_button = driver.find_element_by_xpath('//*[#id="button-new"]')
followed by
new_button.click()
But I get the NoSuchElementException and it cannot locate it.
I've not had this problem with any other elements and not sure where I'm going wrong.
EDIT with solution:
I realised I needed to switch iframe
driver.switch_to.frame(driver.find_element_by_id("nested1"))
To make sure whether the element is being located try this:
new_button_list = driver.find_elements_by_xpath('//a[#id="button-new"]')
this will return a list because of using 'elements':
then check the length of the list, one good thing is it wont through an exception and also let you know whether the element is located.
try to use it with if statement, maybe they put special a empty button to confuse us,
new_button = driver.find_element_by_id("button-new")
if new_button:
new_button.click()
can you check with find_elements_by_id how many btn are there ?
btns = driver.find_elements_by_id("button-new")
print(btns)
# also we can check with # find_elements_by_id
btns = driver.find_elements_by_id("button-new")
if len(btns):
new_button[0].click()

Cannot Click a button With Selenium

I am trying to automate a process of clicking some buttons. Although I have come really far and only 1 button that is not being able to work . I am using python with selenium. So I just want to click this button but I am unable to do so. Below is my code I have tried with css select and by xpath but Still I am unable to click it , I am getting error path not found.
This is the button that I want to click
<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit" type="button" onclick=";return false;" data-channel-creation-token="GhaqucG9ARAKDi9teV92aWRlb3M_bz1VKAQ%3D"><span class="yt-uix-button-content">CREATE CHANNEL</span></button>
I have tried the following 2 codes but none of them work.
driver.find_element_by_xpath("//button[#class='button.yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit']").click()
driver.find_element_by_css_selector('button.yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit').click()
Let's go over your attempts:
driver.find_element_by_xpath("//button[#class='button.yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit']").click()
This one did not work because you are trying to put a CSS selector into a #class attribute value check. You meant to do something like:
//button[#class='yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit']
driver.find_element_by_css_selector('button.yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit').click()
This one did not work since you are not specifying multiple classes in a CSS selector correctly, classes need to be separated with a dot:
button.yt-uix-button.yt-uix-button-size-default.yt-uix-button-primary.create-channel-submit
Note that a much simpler selector should do the job - you don't have to specify all classes in a CSS selector - pick a more data-oriented and unique one, in this case I think this should be reasonably reliable and readable:
driver.find_element_by_css_selector('button.create-channel-submit').click()
Assuming you want to click on the button CREATE CHANNEL you need to consider the presence of the <span> tag, within the <button> tag. You can use the following line of code:
driver.find_element_by_xpath("//button[#class='yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit']/span[class='yt-uix-button-content']").click()
You can click on your element with next method:
driver.find_element_by_xpath("//span[(#class='yt-uix-button-content') and contains(text(), 'CREATE CHANNEL')]/..").click()
You can try this code
driver.find_element_by_css_selector('button.yt-uix-button.yt-uix-button-size-default.yt-uix-button-primary.create-channel-submit').click();
can you try using by_class_name. You are using xpath and css to look up the class name
driver.find_element_by_class_name('yt-uix-button yt-uix-button-size-default yt-uix-button-primary create-channel-submit')

Using Selenium in Python to click/select a radio button

I am trying to select from a list of 3 buttons, but can't find a way to select them. Below is the HTML I am working with.
<input name="pollQuestion" type="radio" value="SRF">
<font face="arial,sans-serif" size="-1">ChoiceOne</font><br />
<input name="pollQuestion" type="radio" value="COM">
<font face="arial,sans-serif" size="-1">ChoiceTwo</font><br />
<input name="pollQuestion" type="radio" value="MOT">
<font face="arial,sans-serif" size="-1">ChoiceThree</font>
I can find it by using the following code:
for i in browser.find_elements_by_xpath("//*[#type='radio']"):
print i.get_attribute("value")
This outputs: SRF,COM,MOT
But I would like to select ChoiceOne. (To click it) How do I do this?
Use CSS Selector or XPath to select by value attribute directly, then click it.
browser.find_element_by_css_selector("input[type='radio'][value='SRF']").click()
# browser.find_element_by_xpath(".//input[#type='radio' and #value='SRF']").click()
Corrections (but OP should learn how to look up in documentation)
In Python binding, find_elements_by_css doesn't exist, it's called find_elements_by_css_selector. One should be able to look at the exception message and look back into documentation here and figure out why.
Notice the difference between find_element_by_css_selector and find_elements_by_css_selector? The first one finds the first matching element, the second one finds a list, so you need to use [0] to index. Here is the API documentation. The reason why I use the latter, is because I copied your code, which I shouldn't.
Selenium webdriver Radio button click
When i used xpath :
driver.find_element_by_xpath("//input[#id='id_gender2']").click()
radio button not selected
But I used css_selector :
driver.find_element_by_css_selector("input#id_gender1").click()
radio button selected
find_elements_by_css_selector worked for me,
browser.find_elements_by_css_selector("input[type='radio'][value='SRF']")[0].click()
First Radio button was not selected for me also. But after inserting Time it works for me.
driver.find_element_by_class_name("login").click()
driver.find_element_by_id("email_create").send_keys("testsel000#gmail.com")
driver.find_element_by_id("SubmitCreate").click()
time.sleep(2)
driver.find_element_by_css_selector("#id_gender2").click()
Consider that you have a radio button to select either of the two options, "Male or "Female". Then try using the following :- This is in Python (Selenium).
driver.find_element_by_xpath("//label[contains(text(),'Male')]").click()
browser.find_elements_by_xpath(".//input[#type='radio' and #value='SRF']")[0].click
This ended up being the fix. I was getting errors without the [0] there, that a list does not have a click() attribute (even though there was only 1 match). Thanks for the help user1177636!

Categories