Selenium can`t find element - "connect" button in LinkedIn - python

Hey guys I am working on an automating bot for adding connections in LinkedIn, recently I encountered a problem for finding the "Connect" element(button) after searching in the search box and filtering for "People only".
That is the inspect of the relevant part:
<div id="ember374" class="ember-view">
<button id="ember378" class="artdeco-button artdeco-button--2 artdeco-button--secondary ember-view" data-control-name="entity_action_primary" data-control-id="AQT4G2UkQk6LQlbdf6XySw==">
<!---->
<span class="artdeco-button__text">Connect</span></button>
This is my tries for clicking on that "connect" element:
1. CONNECT_BUTTON_SEARCH_PAGE = "//*[contains(#class,'artdeco-button__text') and contains(.,'Connect')]"
2. CONNECT_BUTTON_SEARCH_PAGE = "//*[text()='Connect']"
3. CONNECT_BUTTON_SEARCH_PAGE = "//button[contains(. , ’Connect’)]"
WebDriverWait(self.driver, 5).until(EC.presence_of_element_located(
(By.XPATH, Xpath.CONNECT_BUTTON_SEARCH_PAGE))).click()
I have to mention that it works fine in the "Network" page, but I want it to add connections after searching a key word. So when I'm searching people according to a special key word, in that page I don't find the "Connect" button
I don`t know why but I can not reach for that element, appreciate if someone could help me

Finaly found a (weird) soulution with the help of #arundeepchohan.
First I used this xpath:
"//button/span[text()='Connect']/.."
But then I had to "refresh" the page before trying to click the "connect" button. I don't have an explanation for that to work and why it was necessary to refresh the page, but I used this part of code before the clicking method:
time.sleep(2)
self.driver.get(self.driver.current_url)
Thanks for everyone who tried to help!

Try this xpath :
//button[contains(. , ’Connect’)]

Related

I cannot find a "button onclick" element using Selenium and Python

I am automating a process using Selenium and python. Right now, I am trying to click on a button in a webpage (sorry I cannot share the link, since it requires credential to login), but there is no way my code can find this button element. I have tried every selector (by id, css selector, xpath, etc.) and done a lot of googling, but no success.
Here is the source content from the web page:
<button onclick="javascript: switchTabs('public');" aria-selected="false" itemcount="-1" type="button" title="Public Reports" dontactassubmit="false" id="public" aria-label="" class="col-xs-12 text-left list-group-item tabbing_class active"> Public Reports </button>
I also added a sleep command before this to make sure the page is fully loaded, but it does not work.
Can anyone help how to select this onclick button?
Please let me know if you need more info.
Edit: you can take a look at this picture to get more insight (https://ibb.co/cYXWkL0). The yellow arrow indicates the button I want to click on.
The element you trying to click is inside an iframe. So, you need to switch driver into the iframe content before accessing elements inside it.
I can't give you a specific code solution since you didn't share a link to that page, even not all that HTML block. You can see solutions for similar questions here or enter link description here. More results can be found with google search

Selenium - Can't click link having onclick event

So this is the link I'm trying to click:
<a class="nav-link text-light" href="#" onclick="return hydra.dissent.selectCommentsTab(event, 'top', {"url":"https://www.some-website.com/","v":"begin","uid":"5xxxxxxx5f2bc7d4b7","s":"controversial","p":1,"cpp":10});">Top</a>
I fetched it using driver.find_element(By.CSS_SELECTOR, "a.nav-link.text-light") and verified it by using get_attribute("innerText") and it did show Top.
But when I try .click() on it, nothing seems to happen.
I also tried .send_keys(Keys.ENTER) and that didn't work either.
Then I tried driver.execute_script("<onclick_text_here>"); still no luck.
The code doesn't throw any error either, so I don't know what the issue is.
Any help would be appreciated.
href="#"
basically means even if you click, it won't redirect you anywhere.
and text also says Top, may be when you click it scroll till Top which can be achieved by many ways in Selenium.

Python selenium - cant find element

I am not completely new to selenium but I cannot work this out. I am supposed to do a basket automation and I have troubles at the first page.
I am supposed to fill three input boxes at first to proceed to the actual order but I fail at the first input. We have unique ids for almost every input so it should not be too hard to find it but somehow it is.
<input class="form-input--text" data-validitytext-empty="Položka je povinná.<br>Prosíme, vyplňte ji." data-validitytext-invalid="Položka má špatný formát.<br>Prosíme, opravte ji." data-label-selector="closest(.form-item--required)->find(label.form-label)" id="surname003" name="Prijmeni" type="text" value="" data-form-required="true" xpath="1">
This is how the first input is described with id of "surname003" so my first try was to do this
driver.find_element_by_xpath("//*[#id='surname003']").send_keys("text")
Then I tried to access it with id
driver.find_element_by_id("surname003").send_keys("text")
Nothing from this was working so I tried to get the full xpath of it but that did not work.
This is how the code looks as a whole
driver = webdriver.Chrome(executable_path=r"C:\Users\KDK\Desktop\Selenium setup\chromedriver.exe")
driver.get(URL2)
driver.maximize_window()
driver.implicitly_wait(10)
driver.find_element_by_xpath("//*[#id='surname003']").send_keys("test")
driver.find_element_by_xpath("//*[#id='phone03']").send_keys(telefon)
driver.find_element_by_xpath("//*[#id='email03']").send_keys(email)
This is the error I get
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:
This is the page I am working with :
https://www.nev-dama.cz/zima/rakousko/lungau/residence-carpe-solem-mariapfarr/rezervaceNova?termin=2021-01-10&typologie=[26225]&delka=3
I am thinking if the issue of locating the element is somehow connected to the fact that you can switch between two "windows" in the reservation page. You can switch between "Not binding reservation" and "Buy online" and I dont know if that makes it somehow harder to get to the element.
I hope someone can help me with this. If something is not clear please ask me and thanks for reading and thanks in advance for some answers! :)
They have few inputs with the same id and first is from another from. But it mustn't raise NoSuchElementException.
Try XPATH like that
//div[#id="koupit-online"]//*[#id='surname003'].
You need to add this part //div[#id="koupit-online"] to all all xpath or use as context
form = driver.find_element_by_xpath("//div[#id='koupit-online']")
form.find_element_by_xpath(".//input[#id='surname003']").send_keys("test")
form.find_element_by_xpath(".//input[#id='phone03']").send_keys(telefon)
form.find_element_by_xpath(".//input[#id='email03']").send_keys(email)
Second problem can be chromedriver. When i used chrome with selenium i got this exception without reason. I changed browser to firefox and geckodriver and this never happend again

How to find the "See More Posts from..." button? Selenium - Python

Disclaimer: sorry if my explanation is weird. It's my first week learning.
As my first project, I've set out to build a program that counts Instagram posts in a given time frame. Almost everything works, but there is one button standing in my way. (sometimes)
When you open up Instagram with WebDriver, the GDPR notice pops up. This is easy to get rid of since the xpath for this button is always the same. Or less barbaric way:
driver = webdriver.Chrome()
driver.get(ig_link)
driver.find_element_by_xpath('//button[text()="Accept"]').click()
then, I want to scroll down and during it, get URLs of all posts on the page. As I've already mentioned, on some profiles this works just fine. Yet on others, only few recent posts load up and then you are required to press this pesky "Show More Posts from {instagram_tag}"
My idea was to just brute-force it through driver.find_element_by_xpath() but then I found out that on different IG pages, the xpath is different. The button also doesn't have any text directly inside it, so I am not able to use the same approach that I've used with the "Accept" button.
<button class="tCibT qq7_A z4xUb w5S7h">
<div class="Igw0E IwRSH eGOV_ _4EzTm lC6p0 HVWg4">
<div class="_7UhW9 xLCgt qyrsm h_zdq uL8Hv l4b0S ">Show More Posts from choco_afro
</div>
</div>
</button>
My idea is that I check whether the div element under button includes text "Show More Posts" and then click the button, but I don't know how to do that if even possible. Would anybody be so kind and help me with this? :)
I believe, that, this xpath might help you.
//button//div[contains(text(), 'Show More Posts')]/../..
If each IG page has the same HTML design, then this example should help you. Solution: Click Show More Posts Button
driver.find_element(By.XPATH, "//button//div[contains(text(), 'Show More Posts')]/../..").click()
Try this:
btn = driver.find_element_by_xpath('//button[#class = "tCibT qq7_A z4xUb w5S7h"]')
div = btn.find_elements_by_tag_name('div')[1]
if 'Show More Posts' in div.text.strip():
btn.click()
You can use the following to retrieve that button from it's sibling's text by css selector.
//div[text()='Show More Posts from choco_afro']/parent::div/parent::button

Selenium Click JS Button - Python?

yeah, there are similar question, but upon reading through them I weren't able to find a solution for my problem.
Following situation: I'm tryin to click the "reply" button on "https://charleston.craigslist.org/ctd/d/charleston-2018-nissan-sentra-sedan-4d/7108660907.html" and after executing this click a popups shows up where I shall click another button, but let's start with the first button as the "reply" click itself is very trouble-making.
The reply button has the following X-Path:
'/html/body/section/section/header/div[2]/div/button'
speaking of which the source code is:
<button role="button" class="reply-button js-only" data-href="/__SERVICE_ID__/chs/ctd/7108660907">
reply
</button>
(see code on mentioned website).
However, my approach with Selenium (Python) doesn't work:
reply_button = '/html/body/section/section/header/div[2]/div/button'
driver.get('https://charleston.craigslist.org/ctd/d/charleston-2018-nissan-sentra-sedan-4d/7108660907.html')
driver.find_element_by_xpath(reply_button).click()
Everytime I tried, the website just loads up properly (even with implementing time.sleep(x)) and tries to click the button, but this fails and the website just refreshes - my guess is that they either regocnize the browser being Selenium-controlled, that the click isn't legitimate or that I didn't catch anything right in my code.. Anyone able to help out?
Btw I already tried searching "by_class_name", that didn't work either.
This Xpath: '/html/body/section/section/header/div[2]/div/button' is like when you get a map with instructions like step forward until you see a car then turn left 30° then step forward until you see a tree then hop twice then go to the second house to your right. Not safe to use, avoid such paths. If the page layout changes, your path may become invalid.
Try this:
button = driver.find_element_by_xpath('//*[#class="reply-button js-only"]')
button.click()
Clicking the button opens a "show phone number" popup (which may be located by driver.find_element_by_xpath('//*[#class="show-phone"]')).
Explanation:
If you want proper Xpath, inspect what you want to interact with. The button you want to click is this:
<button role="button" class="reply-button js-only" data-href="/__SERVICE_ID__/chs/ctd/7108660907">
reply
</button>
You can see that it has no "id" tag but it is a button with a specific class. You may copy right away the "class" part -> class="reply-button js-only"
Now you can check if is it unique enough:
driver.find_elements_by_xpath('//*[#class="reply-button js-only"]')
If "find elements" returns a single result, usually you should be OK. You can see that all I did is that I pasted the class inside this: driver.find_elements_by_xpath('//*[# and this ]').
If you need more accuracy, you can specify that it is a button:
driver.find_element_by_xpath('//button[#class="reply-button js-only"]')
Or it is the direct child of the element with class: class="actions-combo", so a more safe path would be:
driver.find_element_by_xpath('//*[#class="actions-combo"]/button[#class="reply-button js-only"]')
This pattern works for all webelement attributes, not just for classes. You could use the role="button" too for more filtering. Look up for Xpath, it is a pretty neat stuff.

Categories

Resources