From 77f763e43f96668af8f53d062a33a51d8d709572 Mon Sep 17 00:00:00 2001
From: NaveenChandar <12165092+navchandar@users.noreply.github.com>
Date: Thu, 11 Apr 2024 16:44:14 +0530
Subject: [PATCH] Minor updates to fix recent changes to Naukri
---
README.md | 4 +-
naukri.py | 128 +++++++++++++++++++++++++++++-------------------------
2 files changed, 71 insertions(+), 61 deletions(-)
diff --git a/README.md b/README.md
index f38902a..d7d039f 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,8 @@ Install [Python 3.10+](https://www.python.org/getit/) and run the below commands
git clone https://github.com/navchandar/Naukri.git
cd Naukri
pip install --upgrade pip
+python3 -m venv .venv # create virtual environment for installing dependencies
+./.venv/bin/activate.ps1 # or source ./.venv/bin/activate for macOS/linux
pip install -r requirements.txt
```
@@ -32,7 +34,7 @@ python naukri.py
| [](http://godban.github.io/browsers-support-badges/)
Chrome |
| --------- |
-| last 20 versions
+| last 10 versions
## Contribute
diff --git a/naukri.py b/naukri.py
index 8ba364d..7718fa3 100644
--- a/naukri.py
+++ b/naukri.py
@@ -2,27 +2,26 @@
# -*- coding: utf-8 -*-
"""Naukri Daily update - Using Chrome"""
-import re
-import os
import io
+import logging
+import os
import sys
import time
-import logging
-from selenium import webdriver
-from selenium.webdriver.support.ui import WebDriverWait
-from selenium.webdriver.common.keys import Keys
-from selenium.webdriver.common.by import By
-from selenium.common.exceptions import NoSuchElementException
-from selenium.common.exceptions import NoAlertPresentException
-from pypdf import PdfReader, PdfWriter
-from string import ascii_uppercase, digits
-from random import choice, randint
from datetime import datetime
-from reportlab.pdfgen import canvas
+from random import choice, randint
+from string import ascii_uppercase, digits
+
+from pypdf import PdfReader, PdfWriter
from reportlab.lib.pagesizes import letter
+from reportlab.pdfgen import canvas
+from selenium import webdriver
+from selenium.common.exceptions import NoSuchElementException
+from selenium.webdriver.chrome.service import Service as ChromeService
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager as CM
-
# Add folder Path of your resume
originalResumePath = "original_resume.pdf"
# Add Path where modified resume should be saved
@@ -45,7 +44,7 @@
level=logging.INFO, filename="naukri.log", format="%(asctime)s : %(message)s"
)
# logging.disable(logging.CRITICAL)
-os.environ['WDM_LOCAL'] = "1"
+os.environ["WDM_LOCAL"] = "1"
os.environ["WDM_LOG_LEVEL"] = "0"
@@ -57,7 +56,7 @@ def log_msg(message):
def catch(error):
"""Method to catch errors and log error details"""
- exc_type, exc_obj, exc_tb = sys.exc_info()
+ _, _, exc_tb = sys.exc_info()
lineNo = str(exc_tb.tb_lineno)
msg = "%s : %s at Line %s." % (type(error), error, lineNo)
print(msg)
@@ -67,13 +66,13 @@ def catch(error):
def getObj(locatorType):
"""This map defines how elements are identified"""
map = {
- "ID" : By.ID,
- "NAME" : By.NAME,
- "XPATH" : By.XPATH,
- "TAG" : By.TAG_NAME,
- "CLASS" : By.CLASS_NAME,
- "CSS" : By.CSS_SELECTOR,
- "LINKTEXT" : By.LINK_TEXT
+ "ID": By.ID,
+ "NAME": By.NAME,
+ "XPATH": By.XPATH,
+ "TAG": By.TAG_NAME,
+ "CLASS": By.CLASS_NAME,
+ "CSS": By.CSS_SELECTOR,
+ "LINKTEXT": By.LINK_TEXT,
}
return map[locatorType.upper()]
@@ -81,11 +80,13 @@ def getObj(locatorType):
def GetElement(driver, elementTag, locator="ID"):
"""Wait max 15 secs for element and then select when it is available"""
try:
+
def _get_element(_tag, _locator):
_by = getObj(_locator)
if is_element_present(driver, _by, _tag):
return WebDriverWait(driver, 15).until(
- lambda d: driver.find_element(_by, _tag))
+ lambda d: driver.find_element(_by, _tag)
+ )
element = _get_element(elementTag, locator.upper())
if element:
@@ -113,14 +114,14 @@ def WaitTillElementPresent(driver, elementTag, locator="ID", timeout=30):
driver.implicitly_wait(0)
locator = locator.upper()
- for i in range(timeout):
+ for _ in range(timeout):
time.sleep(0.99)
try:
if is_element_present(driver, getObj(locator), elementTag):
result = True
break
except Exception as e:
- log_msg('Exception when WaitTillElementPresent : %s' %e)
+ log_msg("Exception when WaitTillElementPresent : %s" % e)
pass
if not result:
@@ -163,9 +164,9 @@ def LoadNaukri(headless):
# updated to use ChromeDriverManager to match correct chromedriver automatically
driver = None
try:
- driver = webdriver.Chrome(executable_path=CM().install(), options=options)
+ driver = webdriver.Chrome(options, service=ChromeService(CM().install()))
except:
- driver = webdriver.Chrome(options=options)
+ driver = webdriver.Chrome(options)
log_msg("Google Chrome Launched!")
driver.implicitly_wait(3)
@@ -173,10 +174,14 @@ def LoadNaukri(headless):
return driver
-def naukriLogin(headless = False):
- """ Open Chrome browser and Login to Naukri.com"""
+def naukriLogin(headless=False):
+ """Open Chrome browser and Login to Naukri.com"""
status = False
driver = None
+ username_locator = "usernameField"
+ password_locator = "passwordField"
+ login_btn_locator = "//*[@type='submit' and normalize-space()='Login']"
+ skip_locator = "//*[text() = 'SKIP AND CONTINUE']"
try:
driver = LoadNaukri(headless)
@@ -185,22 +190,12 @@ def naukriLogin(headless = False):
log_msg("Website Loaded Successfully.")
emailFieldElement = None
- if is_element_present(driver, By.ID, "emailTxt"):
- emailFieldElement = GetElement(driver, "emailTxt", locator="ID")
+ if is_element_present(driver, By.ID, username_locator):
+ emailFieldElement = GetElement(driver, username_locator, locator="ID")
time.sleep(1)
- passFieldElement = GetElement(driver, "pwd1", locator="ID")
+ passFieldElement = GetElement(driver, password_locator, locator="ID")
time.sleep(1)
- loginXpath = "//*[@type='submit' and @value='Login']"
- loginButton = GetElement(driver, loginXpath, locator="XPATH")
-
- elif is_element_present(driver, By.ID, "usernameField"):
- emailFieldElement = GetElement(driver, "usernameField", locator="ID")
- time.sleep(1)
- passFieldElement = GetElement(driver, "passwordField", locator="ID")
- time.sleep(1)
- loginXpath = '//*[@type="submit"]'
- loginButton = GetElement(driver, loginXpath, locator="XPATH")
-
+ loginButton = GetElement(driver, login_btn_locator, locator="XPATH")
else:
log_msg("None of the elements found to login.")
@@ -216,13 +211,13 @@ def naukriLogin(headless = False):
# Added click to Skip button
print("Checking Skip button")
- skipAdXpath = "//*[text() = 'SKIP AND CONTINUE']"
- if WaitTillElementPresent(driver, skipAdXpath, locator="XPATH", timeout=10):
- GetElement(driver, skipAdXpath, locator="XPATH").click()
+
+ if WaitTillElementPresent(driver, skip_locator, "XPATH", 10):
+ GetElement(driver, skip_locator, "XPATH").click()
# CheckPoint to verify login
- if WaitTillElementPresent(driver, "search-jobs", locator="ID", timeout=40):
- CheckPoint = GetElement(driver, "search-jobs", locator="ID")
+ if WaitTillElementPresent(driver, "ff-inventory", locator="ID", timeout=40):
+ CheckPoint = GetElement(driver, "ff-inventory", locator="ID")
if CheckPoint:
log_msg("Naukri Login Successful")
status = True
@@ -242,18 +237,24 @@ def naukriLogin(headless = False):
def UpdateProfile(driver):
try:
mobXpath = "//*[@name='mobile'] | //*[@id='mob_number']"
- profeditXpath = "//a[contains(text(), 'UPDATE PROFILE')] | //a[contains(text(), ' Snapshot')] | //a[contains(@href, 'profile') and contains(@href, 'home')]"
saveXpath = "//button[@ type='submit'][@value='Save Changes'] | //*[@id='saveBasicDetailsBtn']"
- editXpath = "//em[text()='Edit']"
+ view_profile_locator = "//*[contains(@class, 'view-profile')]//a"
+ edit_locator = "(//*[contains(@class, 'icon edit')])[1]"
+ save_confirm = "//*[text()='today' or text()='Today']"
+ close_locator = "//*[contains(@class, 'crossIcon')]"
- WaitTillElementPresent(driver, profeditXpath, "XPATH", 20)
- profElement = GetElement(driver, profeditXpath, locator="XPATH")
+ WaitTillElementPresent(driver, view_profile_locator, "XPATH", 20)
+ profElement = GetElement(driver, view_profile_locator, locator="XPATH")
profElement.click()
driver.implicitly_wait(2)
- WaitTillElementPresent(driver, editXpath + " | " + saveXpath, "XPATH", 20)
- if is_element_present(driver, By.XPATH, editXpath):
- editElement = GetElement(driver, editXpath, locator="XPATH")
+ if WaitTillElementPresent(driver, close_locator, "XPATH", 10):
+ GetElement(driver, close_locator, locator="XPATH").click()
+ time.sleep(2)
+
+ WaitTillElementPresent(driver, edit_locator + " | " + saveXpath, "XPATH", 20)
+ if is_element_present(driver, By.XPATH, edit_locator):
+ editElement = GetElement(driver, edit_locator, locator="XPATH")
editElement.click()
WaitTillElementPresent(driver, mobXpath, "XPATH", 20)
@@ -266,8 +267,8 @@ def UpdateProfile(driver):
saveFieldElement.send_keys(Keys.ENTER)
driver.implicitly_wait(3)
- WaitTillElementPresent(driver, "//*[text()='today']", "XPATH", 10)
- if is_element_present(driver, By.XPATH, "//*[text()='today']"):
+ WaitTillElementPresent(driver, save_confirm, "XPATH", 10)
+ if is_element_present(driver, By.XPATH, save_confirm):
log_msg("Profile Update Successful")
else:
log_msg("Profile Update Failed")
@@ -298,8 +299,8 @@ def UpdateResume():
try:
# random text with with random location and size
txt = randomText()
- xloc = random.randint(700, 1000) # this ensures that text is 'out of page'
- fsize = random.randint(1, 10)
+ xloc = randint(700, 1000) # this ensures that text is 'out of page'
+ fsize = randint(1, 10)
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
@@ -337,8 +338,15 @@ def UploadResume(driver, resumePath):
attachCVID = "attachCV"
CheckPointXpath = "//*[contains(@class, 'updateOn')]"
saveXpath = "//button[@type='button']"
+ close_locator = "//*[contains(@class, 'crossIcon')]"
driver.get("https://www.naukri.com/mnjuser/profile")
+
+ time.sleep(2)
+ if WaitTillElementPresent(driver, close_locator, "XPATH", 10):
+ GetElement(driver, close_locator, locator="XPATH").click()
+ time.sleep(2)
+
WaitTillElementPresent(driver, attachCVID, locator="ID", timeout=10)
AttachElement = GetElement(driver, attachCVID, locator="ID")
AttachElement.send_keys(resumePath)