Code Monkey home page Code Monkey logo

linkedin-easy-apply-bot's Introduction

LinkedIn Easy Apply Bot

Automatically apply to LinkedIn Easy Apply jobs. This bot answers the application questions as well!

This is for educational purposes only. I am not responsible if your LinkedIn account gets suspended or for anything else.

This bot is written in Python using Selenium.

Setup

To run the bot, open the command line in the cloned repo directory and install the requirements using pip with the following command:

pip install -r requirements.txt

Next, you need to fill out the config.yaml file. Most of this is self-explanatory but if you need explanations please see the end of this README.

email: [email protected]
password: yourpassword

disableAntiLock: False

remote: False

experienceLevel:
 internship: False
 entry: True
 associate: False
 mid-senior level: False
 director: False
 executive: False
 
jobTypes:
 full-time: True
 contract: False
 part-time: False
 temporary: False
 internship: False
 other: False
 volunteer: False
 
date:
 all time: True
 month: False
 week: False
 24 hours: False
 
positions:
 #- First position
 #- A second position
 #- A third position
 #- ...
locations:
 #- First location
 #- A second location
 #- A third location
 #- ...
distance: 25

outputFileDirectory: C:\Users\myDirectory\

companyBlacklist:
 #- company
 #- company2

titleBlacklist:
 #- word1
 #- word2

uploads:
 resume: C:\Users\myDirectory\Resume.pdf
 # Cover letter is optional
 #coverLetter: C:\Users\myDirectory\CoverLettter.pdf


# ------------ QA section -------------------

# ------------ Additional parameters: checkboxes ---------------
checkboxes:
 # Do you have a valid driver's license? (yes/no checkbox)
 driversLicence: True
 # Will you now, or in the future, require sponsorship for employment visa status (e.g. H-1B visa status)? (yes/no checkbox)
 # This is relative to the location and your citizenship applying above, and same with legallyAuthorized.
 requireVisa: False
 # Are you legally authorized to work in COUNTRY? (yes/no checkbox)
 legallyAuthorized: True
 # We must fill this position urgently. Can you start immediately? (yes/no checkbox)
 urgentFill: True
 # Are you comfortable commuting to this job's location? (yes/no checkbox)
 commute: True
 # Have you completed the following level of education: DEGREE TYPE? (yes/no checkbox)
 degreeCompleted:
  - High School Diploma
  - Bachelor's Degree
  # - Associate's Degree
  # - Master's Degree
  # - Master of Business Administration
  # - Doctor of Philosophy
  # - Doctor of Medicine
  # - Doctor of Law
 # Are you willing to undergo a background check, in accordance with local law/regulations?
 backgroundCheck: True

# ------------ Additional parameters: univeristyGpa ---------------
universityGpa: 4.0

# ------------ Additional parameters: languages ---------------
languages:
 english: Native or bilingual # None, Conversational, Professional, Native or bilingual


# ------------ Additional parameters: years of INDUSTRY experience ---------------
# How many years of TECHNOLOGY experience do you currently have? (whole numbers only)
industry:
 # normal ones
 Accounting/Auditing: 0
 Administrative : 0
 Advertising : 0
 Analyst : 0
 Art/Creative: 0
 Business Development: 0
 Consulting: 0
 Customer Service: 0
 Distribution Design: 0
 Education: 0
 Engineering: 0
 Finance: 0
 General Business: 0
 Health Care Provider: 0
 Human Resources: 0
 Information Technology: 0
 Legal: 0
 Management: 0
 Manufacturing: 0
 Marketing: 0
 Public Relations: 0
 Purchasing: 0
 Product Management: 0
 Project Management: 0
 Production: 0
 Quality Assurance: 0
 Research: 0
 Sales: 0
 Science: 0
 Strategy/Planning: 0
 Supply Chain: 0
 Training: 0
 Writing/Editing: 0
 # end normal ones
 # put your custom ones here
 #C++: 0
 #Python: 1
 # default to put for any skill that you did not list
 default: 0
 # end custom ones


# ------------ Additional parameters: years of technology experience ---------------
# How many years of work experience do you have using TECHNOLOGY? (whole numbers only)
technology:
 #python: 0
 #selenium: 0
 # default to put for any skill that you did not list
 default: 0
# ------------ Additional parameters: personal info ---------------
personalInfo:
 First Name: FirstName
 Last Name: LastName
 Phone Country Code: Canada (+1) # See linkedin for your country code, must be exact
 Mobile Phone Number: 1234567890
 Street address: 123 Fake Street
 City: Red Deer, Alberta # Include the state/province as well!
 State: YourState
 Zip: YourZip/Postal
 Linkedin: https://www.linkedin.com/in/my-linkedin-profile
 Website: https://www.my-website.com # github/website is interchangable here

# ------------ Additional parameters: USA employment crap ---------------
eeo:
 gender: None
 race: None
 vetran: None
 disability: None
 citizenship: Canadian

Execute

To run the bot, run the following in the command line:

python3 main.py

Config.yaml Explanations

Just fill in your email and password for linkedin.

email: [email protected]
password: yourpassword

This prevents your computer from going to sleep so the bot can keep running when you are not using it. Set this to True if you want this disabled.

disableAntiLock: False

Set this to True if you want to look for remote jobs only.

remote: False

This is for what level of jobs you want the search to contain. You must choose at least one.

experienceLevel:
 internship: False
 entry: True
 associate: False
 mid-senior level: False
 director: False
 executive: False

This is for what type of job you are looking for. You must choose at least one.

jobTypes:
 full-time: True
 contract: False
 part-time: False
 temporary: False
 internship: False
 other: False
 volunteer: False

How far back you want to search. You must choose only one.

date:
 all time: True
 month: False
 week: False
 24 hours: False

A list of positions you want to apply for. You must include at least one.

positions:
 #- First position
 #- A second position
 #- A third position
 #- ...

A list of locations you are applying to. You must include at least one.

locations:
 #- First location
 #- A second location
 #- A third location
 #- ...

How far out of the location you want your search to go. You can only input 0, 5, 10, 25, 50, 100 miles.

distance: 25

This is the directory where all the job application stats will go to.

outputFileDirectory: C:\Users\myDirectory\

A list of companies to not apply to.

companyBlacklist:
 #- company
 #- company2

A list of words that will be used to skip over jobs with any of these words in there.

titleBlacklist:
 #- word1
 #- word2

A path to your resume and cover letter.

uploads:
 resume: C:\Users\myDirectory\Resume.pdf
 # Cover letter is optional
 #coverLetter: C:\Users\myDirectory\CoverLettter.pdf

Answer these questions with regards to the company you are applying to. For the degrees part uncomment which degrees you have, and do not add other ones since the linkedin questions are generic.

# ------------ Additional parameters: checkboxes ---------------
checkboxes:
 # Do you have a valid driver's license? (yes/no checkbox)
 driversLicence: True
 # Will you now, or in the future, require sponsorship for employment visa status (e.g. H-1B visa status)? (yes/no checkbox)
 # This is relative to the location and your citizenship applying above, and same with legallyAuthorized.
 requireVisa: False
 # Are you legally authorized to work in COUNTRY? (yes/no checkbox)
 legallyAuthorized: True
 # We must fill this position urgently. Can you start immediately? (yes/no checkbox)
 urgentFill: True
 # Are you comfortable commuting to this job's location? (yes/no checkbox)
 commute: True
 # Have you completed the following level of education: DEGREE TYPE? (yes/no checkbox)
 degreeCompleted:
  - High School Diploma
  - Bachelor's Degree
  #- Associate's Degree
  #- Master's Degree
  #- Master of Business Administration
  #- Doctor of Philosophy
  #- Doctor of Medicine
  #- Doctor of Law
 # Are you willing to undergo a background check, in accordance with local law/regulations?
 backgroundCheck: True

Input your university gpa. Must be a decimal value to one decimal point.

# ------------ Additional parameters: univeristyGpa ---------------
universityGpa: 4.0

List all your languages. You must put the profinenciy as either: None, Conversational, Professional, Native or bilingual

# ------------ Additional parameters: languages ---------------
languages:
 english: Native or bilingual # None, Conversational, Professional, Native or bilingual

Answer the following question for the default industries. Next, input your custom ones. This can include technologies, programming languages, frameworks, etc. The years of experience needs to be a whole number. Fill in the default for industries you did not list (keep in mind if it's not zero, you will get your application seen more often).

# ------------ Additional parameters: years of INDUSTRY experience ---------------
# How many years of TECHNOLOGY experience do you currently have? (whole numbers only)
industry:
 # normal ones
 Accounting/Auditing: 0
 Administrative : 0
 Advertising : 0
 Analyst : 0
 Art/Creative: 0
 Business Development: 0
 Consulting: 0
 Customer Service: 0
 Distribution Design: 0
 Education: 0
 Engineering: 0
 Finance: 0
 General Business: 0
 Health Care Provider: 0
 Human Resources: 0
 Information Technology: 0
 Legal: 0
 Management: 0
 Manufacturing: 0
 Marketing: 0
 Public Relations: 0
 Purchasing: 0
 Product Management: 0
 Project Management: 0
 Production: 0
 Quality Assurance: 0
 Research: 0
 Sales: 0
 Science: 0
 Strategy/Planning: 0
 Supply Chain: 0
 Training: 0
 Writing/Editing: 0
 # put your custom ones here
 #C++: 0
 #Python: 1
 # end custom ones
 # default to put for any skill that you did not list
 default: 0

Answer the following question for your tools and technologies. Things like programming languages, frameworks, etc. The years of experience needs to be a whole number. Fill in the default for technologies you did not list (keep in mind if it's not zero, you will get your application seen more often).

# ------------ Additional parameters: years of technology experience ---------------
# How many years of work experience do you have using TECHNOLOGY? (whole numbers only)
technology:
 #python: 0
 #selenium: 0
 # default to put for any skill that you did not list
 default: 0

Input your personal info. Include the state/province in the city name to not get the wrong city when choosing from a dropdown. The phone country code needs to be exact for the one that is on linkedin. The website is interchangable for github/portfolio/website.

# ------------ Additional parameters: personal info ---------------
personalInfo:
 First Name: FirstName
 Last Name: LastName
 Phone Country Code: Canada (+1) # See linkedin for your country code, must be exact
 Mobile Phone Number: 1234567890
 Street address: 123 Fake Street
 City: Red Deer, Alberta # Include the state/province as well!
 State: YourState
 Zip: YourZip/Postal
 Linkedin: https://www.linkedin.com/in/my-linkedin-profile
 Website: https://www.my-website.com # github/website is interchangable here

This is unused at the moment. For the EEO the bot will try to decine to answer for everything.

# ------------ Additional parameters: USA employment crap ---------------
eeo:
 gender: None
 race: None
 vetran: None
 disability: None
 citizenship: Canadian

linkedin-easy-apply-bot's People

Contributors

nathanduma avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

linkedin-easy-apply-bot's Issues

javascript error: arguments[0].scrollTo is not a function

Going to job page 0
Starting the application process for this page...
Traceback (most recent call last):
File "C:\Users\bob\Documents\python_workspace\LinkedIn-Easy-Apply-Bot\linkedineasyapply.py", line 125, in apply_jobs
self.scroll_slow(job_results)
File "C:\Users\bob\Documents\python_workspace\LinkedIn-Easy-Apply-Bot\linkedineasyapply.py", line 677, in scroll_slow
self.browser.execute_script("arguments[0].scrollTo(0, {})".format(i), scrollable_element)
File "C:\Users\bob\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 493, in execute_script
return self.execute(command, {
File "C:\Users\bob\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 435, in execute
self.error_handler.check_response(response)
File "C:\Users\bob\AppData\Roaming\Python\Python310\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.JavascriptException: Message: javascript error: arguments[0].scrollTo is not a function

Receiving this error after it gets to the job listing page. Jobs show up on the page, but the applying phase never starts.
To get to this point I had to apply the fixes for find_elements. My code now looks like this:

try:
job_results = self.browser.find_elements(By.CLASS_NAME, "jobs-search-results")
self.scroll_slow(job_results)
self.scroll_slow(job_results, step=300, reverse=True)

only single target (not tuple) can be annotated

Hello guys, how to fix this? just copy paste the source locally, installed and run.

python3 easyapplybot.py
File "/home/user/Desktop/LinkedIn-Easy-Apply-Bot/easyapplybot.py", line 206
self.browser, jobs_per_page: int = self.next_jobs_page(position,location,jobs_per_page)
^
SyntaxError: only single target (not tuple) can be annotated

Uploading photo error, uploads CV instead. Freezes the application completely! Roadblock!

image

Either:
A. Include file path for pic

OR

B. Do not insert cv.pdf into photo coz it is not mandatory. (in fact if you do not insert anything in the photo it will continue as normal)

This completely freezes the bot. The action pauses however when I remove the wrongly uploaded file by clicking cross icon and clicking next. it resumes. So i guess only for this photo upload section you can add an exception.?

A THANKS

first of all thanks for this amazing bot
my Q do u have any future plans for making bot about getting new connection to new people form different country based on defined filters, if so would be amazing really

Not Getting Hired

No one will hire me. I've sent out thousands of applications. Please help.

Applies to one job then crashes

I seem to be running into a similar issue as before. The script applies to one job and can't locate the next job. I am using Selenium v4.1.0 and Chrome v96.0.

image

Error assert len(parameters['uploads']) >= 1 and 'resume' in parameters['uploads']

I have the following error and I don't know how to solve it, any idea, thank you very much for this great script.

I have configured the config.yaml in this way and the file is found.

uploads:
resume: C:\LinkedInBot\cv.pdf
 # Cover letter is optional
 #coverLetter: C:\Users\myDirectory\CoverLettter.pdf

and gives the following error

Traceback (most recent call last):
  File "C:\LinkedInBot\main.py", line 122, in <module>
    parameters = validate_yaml()
  File "C:\LinkedInBot\main.py", line 76, in validate_yaml
    assert len(parameters['uploads']) >= 1 and 'resume' in parameters['uploads']
TypeError: object of type 'NoneType' has no len()

TypeError: object of type 'NoneType' has no len()

Getting the following error when running python main.py

Traceback (most recent call last):
  File "main.py", line 122, in <module>
    parameters = validate_yaml()
  File "main.py", line 73, in validate_yaml
    assert len(parameters['positions']) > 0
TypeError: object of type 'NoneType' has no len()

Using python 3.7.7

(Not an issue): Reducing default waiting time for next page

Hi Nathan,

First, great job. I am using on Linux with my test LI account and not banned.

Two questions:

  1. How to reduce default waiting/sleep times? For example:

Sleeping for 892.995133638382 seconds.
Sleeping for 12.566666666666666 minutes.

Any tips? Plus any caveats/risks?

  1. Any instances of accounts being banned in your knowledge? Based on my testing so far, the way script works using Chrome, seems pretty much harmless so I don't see a reason of account being banned.

Apologies to open this discussion as an issue because I couldn't find any other way to speak to you.

Thanks.

Edit: 3/15/22

For # 1, found:

random.randint(500, 900)

In linkedineasyapply.py

Is there a reason for this interval? That is, is it more safer versus (250, 450)? Thanks.

Not an Issue

Hey!
Apparently Im not that smart. I am struggling to get this to function.
Do you by chance have some contact info so that I can email you the error code?

Bot answering "No" to "Working in a remote setting?"

Bot is answering "No" to an Additional Questions prompt asking if "Are you comfortable working in a remote setting?"

Don't mind the picture - I tried to correct it to yes, in panic, before taking a snapshot to see if I could add to the linkedineasyapply.py - but was unable to add the additional question prompt and get it working. Seems to be a new prompt that employers are adding for remote jobs.

2022-05-30 16_01_31-JobBot - JobBot-VM - Remote Desktop Connection - Copy

Anytime I try to start the bot I get this error.

bmilam@Snow:/mnt/c/Users/betak/downloads/LinkedIn-Easy-Apply-Bot-master$ python3 linkedineasyapply.py Traceback (most recent call last): File "linkedineasyapply.py", line 1, in <module> import time, random, csv, pyautogui, pdb, traceback, sys File "/home/bmilam/.local/lib/python3.8/site-packages/pyautogui/__init__.py", line 249, in <module> import mouseinfo File "/home/bmilam/.local/lib/python3.8/site-packages/mouseinfo/__init__.py", line 223, in <module> _display = Display(os.environ['DISPLAY']) File "/usr/lib/python3.8/os.py", line 675, in __getitem__ raise KeyError(key) from None KeyError: 'DISPLAY'

Errors thrown on calling script

ubuntu_uSfJauqxdu

I am getting these errors when running the script in the latest version of Ubuntu. I do not know if this is an error due to it expecting a windows directory in config.yaml. Do you have any idea on how to fix this? Thanks.

Problem with search

Great tool!Many thanks to you for making it better!
I'm running win 10 and after the login procedure, it goes to search it access the windows search bar and then puts 1 letter in job title and 1 in location. I'm going to test it on Linux mint to see if there's a difference.

Wed.Jan.26.2022.5_09_39.PM.mp4

.

Stuck between INFO and DEBUG

Not sure if it's an intended behavior but my console is repeating between DEBUG and INFO, with a "sleeping" message. Is this typical or should I keep trying to fix?

Legend

Thank you for this, it's so cool! Have been running it for an hour and already got an interview offer.

My only issues are that since easy apply forms aren't homogenous there are many fields that the bot doesn't cover. For instance I was just watching it list my ethnic background as Bangladeshi. I am new to coding, but could you possibly tell me how I would add further parameters to the bot/config file please?

Once again, thank you so much you're awesome!

Throws error after applying to one job

Applies to one job then after it's finished it throws back

Could not apply to the job!
Traceback (most recent call last):
  File "C:\Users\ex\Documents\resumes\LinkedIn-Easy-Apply-Bot-master\linkedineasyapply.py", line 167, in apply_jobs
    job_el = job_tile.find_element_by_class_name('job-card-list__title')
  File "C:\Users\ex\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 398, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\Users\ex\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 659, in find_element
    {"using": by, "value": value})['value']
  File "C:\Users\ex\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\ex\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\ex\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

error

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".jobs-search-results"}

Running with same settings on different account = error

Hey, so the bot successfully applies and works with my current settings. However, when I change the username and password parameters to another account, I face the "no more jobs" error. I do see jobs on the web browser, and when using my main account it would apply to those same jobs and not throw an error.

image

Auto-Selects that I am not 18

I started using this super cool program you made and one thing I noticed is that it auto-selects me as not being 18 years old on or before the start of the job. Just a small issue but it could potentially make me not qualified for any jobs it applies for. I could also be filling out the yaml file wrong but I am not sure. Let me know if this is a bug or a user error on my part!
Screen Shot 2021-12-29 at 12 07 05 AM

Keeps reverting country to Canada

Hey, first of, amazing app. Its working fine for now. However, there is an issue for me, it keeps reverting to Canada even when I have mentioned WorldWide in location. I am not sure why that is.

Note: I previously added Canada but then removed it to worldwide. its not working. Even though it worked for some time, then it reverted back to countries. Do I have to mention all the countries by name??

Update: I fixed the issue. So, apparently LinkedIn is now accepting a new parameter called geoId in the URL and its specific to every location apparently and thats why, even when you mention in URL that I am looking Worldwide, or whatever country you choose, it will still give you wrong location. I simply edited the final search url and edited the geoId. So, "&keywords=" became "&geoId=92000000&keywords=". 92000000 is the geoId for WorldWide.

You can find final URL at next_job_page in linkedineasyapply.py. Line 727. or just go at the end of the document.

sleep duration is too long

Sleeping for 881.592579126358 seconds.
could we minimize this sleeping time , i believe this is 14 min!!
could this be between 5 to 7 min as maximum .

one more thing i get this error after this sleeping time
[9640:4564:0718/145744.396:ERROR:gpu_init.cc(440)] Passthrough is not supported, GL is disabled

OS : Windows 10
python version : 3.9.6
running the script from Powershell

Failure to apply to jobs, seeminly caused by inability to find the correct elements

Line 123 in linkedineasyapply.py
try:
job_results = self.browser.find_element_by_class_name("jobs-search-results")
self.scroll_slow(job_results)
self.scroll_slow(job_results, step=300, reverse=True)

This bit was what made it scroll through the jobs list up and down. the find_element_by_class_name appears to be the problem as that element is now called "jobs-search-results-list". If I change the line to read

        job_results = self.browser.find_element_by_class_name("jobs-search-results-list")

Then it will successfully scroll through the list up and down.

After that however I'm stuck and can't fix it. At line 128

        job_list = self.browser.find_elements_by_class_name('jobs-search-results__list')[0].find_elements_by_class_name('jobs-search-results__list-item')

This bit was what made it actually find the jobs themselves. Again the elements seem to be misnamed now, possibly due to a LinkedIn update, but I can't seem to make it find the jobs. It instead goes straight to raising the exception "No more jobs on this page".

I'm just not that good at inspecting elements so I don't know how to fix it. There is a div class "job-search-results-list" within which is a ul class "scaffold-layout__list-container" within which are the "li id" items for each job, with the following

class="ember-view jobs-search-results__list-item occludable-update p0 relative scaffold-layout__list-item

        "

So I'm not sure how to update that line to make it find each of these proper elements. But I know exactly where it is failing.

Default to 0 even if i both of them to 5

Hello,
I setted the default value to 5, but to some questions ie Social Media Marketing it sets automatically to 0. Do u have any idea what I can do to set the default on all values?

Remote job

Can you add a parameter checkbox for are you willing for the remote job because it is selecting no by default?

Multiple Positions & Locations

First off, love this bot! My issue seems to be with having multiple locations and positions inside the config. The bot works fine, but only picks one location and one position to search for: then sleeps, and repeats the same search with the same parameters. Restarting the bot will allow it to start another search with a random location and position.

Is there any way to get this to crawl through the positions and/or locations? My primary focus is on getting multiple positions to work.

It was me. Though, Errno2 re: config.yaml is thrown

Hey there @NathanDuma, thanks in advance for expanding upon this and go Team Canada.

As hinted in the title, I have a feeling this is somehow my own error, but when attempting to run the script in cmd, as soon as I press enter, I'm returned with another C:\ and nothing happens. Forgive me, I really don't have much experience with command line stuff.

I found your fork after attempting to launch the original, yet was getting an error wherein the script would initialize, chrome would open but then the config.yaml file wasn't being found by linkedineasyapply.py. So, scrapped that, set up the config for yours (which looks great btw) and so far, dude.

Thanks in advance!

Cant find 'job-card-list__title' although it exists

Hey, I've tried using your app, however get following issue:

Traceback (most recent call last):
File "C:\Users\Komputer\PycharmProjects\CVAutomation_1\linkedineasyapply.py", line 167, in apply_jobs
job_el = job_tile.find_element_by_class_name('job-card-list__title')
File "C:\Users\Komputer\PycharmProjects\CVAutomation_1\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 398, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "C:\Users\Komputer\PycharmProjects\CVAutomation_1\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 659, in find_element
{"using": by, "value": value})['value']
File "C:\Users\Komputer\PycharmProjects\CVAutomation_1\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "C:\Users\Komputer\PycharmProjects\CVAutomation_1\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\Komputer\PycharmProjects\CVAutomation_1\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=91.0.4472.77)

I'm not sure why it pops up :-/ It seems to be looking for class name 'job-card-list__title', but then returns error that cant find element. I checked that the element with such class name does exist.

Any thoughts?

Default Years of Experience Issue

So, I'm someone with 20 years of experience and a super optimized resume. I usually get a response from 4/5 jobs I apply to. I figured if I scaled it up with this, I could land something epic. However, after applying to 200+ jobs, my response rate fell to 40/200 and I was baffled.

Finally yesterday, I was watching the bot and I noticed for one of the "How many years of experience?" kind of questions that it went to, it entered "0." Immediately I was like "holy shit, that's why my resume isn't even getting looked at! It's putting "0" for a ton of them as they invariably ask these kinds of extra questions and I'm getting filtered out by ATS." Of course I'm super pissed at myself for not QA'ing the process better but I assumed if I have 15 as the default, it would either put 15 or NULL thus preventing the jobs from even successfully submitting, so how in the hell is it doing this? I went through the config and there's literally no "0" even in my entire TXT file. Can you please help me look into this? My car is about to get repossessed and I was trying to speed up my job search, but it actually slowed it down.

Procedure on Linux

Hi, thanks for providing this. Have you tested it on Linux? I'm trying to run it on Lubuntu 20.04 but the bot is entering "d" in the search field and the location it selects appears to be random. I stop it before it gets too far, because it's trying to apply me to irrelevant jobs.

Here's some of the output if it helps.

`python3 main.py
/usr/lib/python3/dist-packages/requests/init.py:89: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "

====== WebDriver manager ======
Current google-chrome version is 98.0.4758
Get LATEST chromedriver version for 98.0.4758 google-chrome
Driver [/home/myname/.wdm/drivers/chromedriver/linux64/98.0.4758.80/chromedriver] found in cache
main.py:16: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=browser_options)
main.py:16: DeprecationWarning: use options instead of chrome_options
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=browser_options)
Starting the search for D in J.
Going to job page 0
Starting the application process for this page...
^CTraceback (most recent call last):
File "/home/myname/LinkedIn-Easy-Apply-Bot/linkedineasyapply.py", line 125, in apply_jobs
self.scroll_slow(job_results)
File "/home/myname/LinkedIn-Easy-Apply-Bot/linkedineasyapply.py", line 678, in scroll_slow
time.sleep(random.uniform(1.0, 2.6))
KeyboardInterrupt

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/myname/LinkedIn-Easy-Apply-Bot/linkedineasyapply.py", line 81, in start_applying
self.apply_jobs(location)
File "/home/myname/LinkedIn-Easy-Apply-Bot/linkedineasyapply.py", line 130, in apply_jobs
raise Exception("No more jobs on this page")
Exception: No more jobs on this page
Sleeping for 879.7411160469055 seconds.
^CTraceback (most recent call last):
File "main.py", line 128, in
bot.start_applying()
File "/home/myname/LinkedIn-Easy-Apply-Bot/linkedineasyapply.py", line 101, in start_applying
time.sleep(time_left)
KeyboardInterrupt
`

NOT AN ISSUE BUT A THANK YOU MESSAGE

Hey Man,
Just to let you know I just landed on a job , thanks to your bot ( and a few follow ups), I scaled it up using AWS, got really interesting results after few trial and error. I really want to donate you some money because of the work that you have put in , let me know your paypal or something man wanna buy you a coffee for sure. : you can connect on my ig: @amishjhamusic or let me know i can drop my email id too. You saved my life man, i was getting depressed sitting at home, consider this as your best achievement you literally made a difference in someone's life. God bless you man, you are really god sent :D

Selenium NoSuchElementException: Message: no such element

Hi, I am stuck on this issue:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".jobs-search-results"}

I thought the page is loading too fast hence adding a delay may help so I added 'driver.implicitly_wait(10)' in:

def init_browser():
    browser_options = Options()
    options = ['--disable-blink-features', '--no-sandbox', '--start-maximized', '--disable-extensions',
               '--ignore-certificate-errors', '--disable-blink-features=AutomationControlled']

    for option in options:
        browser_options.add_argument(option)

    #driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=browser_options)
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=browser_options)

    driver.set_window_position(0, 0)
    driver.maximize_window()
    #added delay to avoid 'method' not found error
    driver.implicitly_wait(10)
    
    return driver

Unfortunately, it didn't help. Any ideas? Thanks.

unable to run

hi,

I am receiving the error below - sorry no coding experience of any sort. Could you help?

PS C:\Users\XXX\Documents\LinkedIn-Easy-Apply-Bot-master> python3 main.py
Traceback (most recent call last):
File "C:\Users\XXX\Documents\LinkedIn-Easy-Apply-Bot-master\main.py", line 122, in
parameters = validate_yaml()
File "C:\Users\XXX\Documents\LinkedIn-Easy-Apply-Bot-master\main.py", line 40, in validate_yaml
assert len(parameters['password']) > 0
TypeError: object of type 'int' has no len()

Thank you!

Can't find a job to apply to

The script can't seem to find the first job after searching for a keyword. It get stuck and goes to sleep for over 800 seconds. Is anyone else having this issue?

Won't apply for jobs? Improper class id or..?

File "C:\Users\Desktop\Easyapplyu\LinkedIn-Easy-Apply-Bot\linkedineasyapply.py", line 124, in apply_jobs
job_results = self.browser.find_element_by_class_name("jobs-search-results")
File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 766, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 1251, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
self.error_handler.check_response(response)
File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".jobs-search-results"}
(Session info: chrome=
Stacktrace:
Backtrace:
Ordinal0 [0x007578B3+2193587]
Ordinal0 [0x006F0681+1771137]
Ordinal0 [0x006041A8+803240]
Ordinal0 [0x006324A0+992416]
Ordinal0 [0x0063273B+993083]
Ordinal0 [0x0065F7C2+1177538]
Ordinal0 [0x0064D7F4+1103860]
Ordinal0 [0x0065DAE2+1170146]
Ordinal0 [0x0064D5C6+1103302]
Ordinal0 [0x006277E0+948192]
Ordinal0 [0x006286E6+952038]
GetHandleVerifier [0x00A00CB2+2738370]
GetHandleVerifier [0x009F21B8+2678216]
GetHandleVerifier [0x007E17AA+512954]
GetHandleVerifier [0x007E0856+509030]
Ordinal0 [0x006F743B+1799227]
Ordinal0 [0x006FBB68+1817448]
Ordinal0 [0x006FBC55+1817685]
Ordinal0 [0x00705230+1856048]
BaseThreadInitThunk [0x7762FA29+25]
RtlGetAppContainerNamedObjectPath [0x77DA7A9E+286]
RtlGetAppContainerNamedObjectPath [0x77DA7A6E+238]

StaleElementReferenceException

Hi,

After applying to one job I got this error.

selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <li id="ember302" class="ember-view jobs-search-results__job-card-search--generic-occludable-area  jobs-search-results__list-item occludable-update p0 relative
                  "> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

After one apply, the bot cant continue

Hey!
First let me thank you for this, its crazy.

so, the bot is going for one apply successfully, after that he loops thro all the over jobs and returns this message for each job post:
Could not apply to the job!
Traceback (most recent call last):
File "C:\Users\Desktop\LinkedIn-Easy-Apply-Bot\linkedineasyapply.py", line 167, in apply_jobs
job_el = job_tile.find_element_by_class_name('job-card-list__title')
File "C:\Users\shaha\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 447, in find_element_by_class_name
return self.find_element(by=By.CLASS_NAME, value=name)
File "C:\Users\shaha\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 735, in find_element
return self._execute(Command.FIND_CHILD_ELEMENT,
File "C:\Users\shaha\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 710, in _execute
return self._parent.execute(command, params)
File "C:\Users\shaha\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 425, in execute
self.error_handler.check_response(response)
File "C:\Users\shaha\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=99.0.4844.74)
Stacktrace:
Backtrace:
Ordinal0 [0x00659943+2595139]
Ordinal0 [0x005EC9F1+2148849]
Ordinal0 [0x004E4528+1066280]
Ordinal0 [0x004E6E04+1076740]
Ordinal0 [0x004E6CBE+1076414]
Ordinal0 [0x004E6F50+1077072]
Ordinal0 [0x00510D1E+1248542]
Ordinal0 [0x005111CB+1249739]
Ordinal0 [0x005074F1+1209585]
Ordinal0 [0x0052BA34+1358388]
Ordinal0 [0x00507474+1209460]
Ordinal0 [0x0052BC04+1358852]
Ordinal0 [0x0053BAF2+1424114]
Ordinal0 [0x0052B806+1357830]
Ordinal0 [0x00506086+1204358]
Ordinal0 [0x00506F96+1208214]
GetHandleVerifier [0x007FB232+1658114]
GetHandleVerifier [0x008B312C+2411516]
GetHandleVerifier [0x006EF261+560433]
GetHandleVerifier [0x006EE366+556598]
Ordinal0 [0x005F286B+2173035]
Ordinal0 [0x005F75F8+2192888]
Ordinal0 [0x005F76E5+2193125]
Ordinal0 [0x006011FC+2232828]
BaseThreadInitThunk [0x7646FA29+25]
RtlGetAppContainerNamedObjectPath [0x77457A7E+286]
RtlGetAppContainerNamedObjectPath [0x77457A4E+238]

and after all of that:
"Could not apply to the job!
Applying to jobs on this page has been completed!
Sleeping for 683.3301115036011 seconds."

any ideas why this happens??

bot keeps applying for jobs in far off lands....

edit: Ignore me, i've never used a .yaml file before and didn't realize I needed dashes. I'll leave this up in case anyone else has the same formatting issues. The solution is, when filling out .yaml, you must format like this:

positions:

  • Adobe Premiere
  • Avid Media Composer
  • animatic

Hey, first off, you're a total ledge for writing this. Once i got it all set up I ran it and noticed it had little random slow scrolls and wait times... nice.

However, i do have an issue! It does seem to be getting my "job title" and "location" correct, see attached screencap below. Job 
title is always a single letter "i" "m" "v" or something, and location is always a different country. Am I doing something wrong? Is that just how the bot... looks? The jobs are at least sort of in my space (video/media) but that could be just because of my linkedin profile and resume.

When i filled out the config.yaml I just write directly under "positions", just plain text no formatting... does it need to be in quotes? Wondering if this is a string issue and somehow it's just pulling random letters from the positions area?? The location is also "E, Savannakhet, Laos" so maybe it's grabbing a random "i" and "e" and just searching it?

my config.yaml looks like this:

positions:
 Adobe Premiere
 Avid Media Composer
 animatic

locations:
 United States

Any thoughts would be appreciated. thanks!

<img width="500" alt="Screen Shot 2022-08-06 at 9 37 09 PM" src="https://user-images.githubusercontent.com/85971387/183275567-d2a7d0fe-7020-44f2-bc7b-8fff4b64022c.png">

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.