For the Review Prep extension feature. Do this at work in Edge/Chrome.
The extension will use CSS selectors to find and read elements on the SuccessFactors review page. You need to identify these selectors once, then put them in the config file.
F12 or right-click anywhere and choose Inspect. The Elements panel should be visible.
You need enough of the URL to uniquely identify "I'm on a review form." Copy it to a notepad.
div > div:nth-child(3) > span. The shorter/more semantic ones survive UI updates better.goalSection, goalItem, or a data-* attribute.| Field | What to look for | Config key |
|---|---|---|
| Goal Title | The name of the goal (bold text, usually first line) | goals.fields.title |
| Metric | The measurable success criteria (below the title) | goals.fields.metric |
| Status | "Completed" / "In Progress" / etc. | goals.fields.status |
| Milestones | Often says "No Data" | goals.fields.milestones |
| Self-Evaluation | The employee's narrative text block | goals.fields.self_evaluation |
| Employee Rating | Only on first ~6-7 goals. A dropdown or display field. | goals.fields.employee_rating |
| Manager Rating | Present on all goals. | goals.fields.manager_rating |
div.goalSection and the title inside it is span.goalTitle, you want just span.goalTitle for the title field.| Field | What to look for | Config key |
|---|---|---|
| Name | The competency category name | competencies.fields.name |
| Definitions | Bullet-point rubric text | competencies.fields.definitions |
| Self-Assessment | Employee's narrative text | competencies.fields.self_assessment |
| Employee Rating | Dropdown or display | competencies.fields.employee_rating |
| Manager Rating | Dropdown or display | competencies.fields.manager_rating |
SuccessFactors has an OData REST API. If it's active, you get structured JSON instead of scraping HTML. More reliable, less brittle. But it might not be available to you.
F12), go to the Network tab.
odata. Look for requests that hit URLs containing:
If you see requests like these, the API is active and your browser's session cookie is authenticating automatically.
/odata/v2/ or /api/)FormContent, Goal, etc.)$filter, $select, $expand)If Step 1 found API calls, try hitting the endpoint directly in a new browser tab to confirm your session works:
$metadata:
$metadata output (no PII, just schema)anvil/work-prompts/reviews/review-config.json
After collecting selectors (Method 1), open review-config.json and replace every FILL_IN with the selector you found. Here's a mapping of what goes where:
| Config Path | What to Put | Example |
|---|---|---|
page_detection.url_pattern |
Part of the URL that identifies a review page | successfactors.com/sf/liveprofile |
page_detection.page_indicator_selector |
A DOM element unique to review forms | #performanceReviewForm |
employee_name.selector |
The employee name element | span.empName |
goals.container_selector |
Repeating wrapper per goal | div.goalSection |
goals.fields.title |
Goal name (relative to container) | span.goalTitle |
goals.fields.metric |
Measurable criteria | span.goalMetric |
goals.fields.status |
Completed / In Progress | span.goalStatus |
goals.fields.milestones |
Usually "No Data" | div.milestoneSection |
goals.fields.self_evaluation |
Employee narrative text | textarea.selfEval, div.selfEvalText |
goals.fields.employee_rating |
Rating (first ~6-7 goals only) | select.empRating, span.empRating |
goals.fields.manager_rating |
Manager rating field | select.mgrRating, span.mgrRating |
goals.overall_summary.selector |
Section summarizing all goals | div.overallGoalSummary |
competencies.container_selector |
Repeating wrapper per competency | div.competencySection |
competencies.fields.name |
Category name | span.compName |
competencies.fields.definitions |
Bullet rubric text | div.compDefinitions |
competencies.fields.self_assessment |
Employee narrative | textarea.compSelfAssessment |
competencies.fields.employee_rating |
Employee rating | select.compEmpRating |
competencies.fields.manager_rating |
Manager rating | select.compMgrRating |
competencies.overall_summary.selector |
Section summarizing all competencies | div.overallCompSummary |
overall_comments.selector |
Employee's summary comments | textarea.overallComments |
#app > div:nth-child(2) > div > span.goalTitle can often be shortened to just span.goalTitle if that class is unique within the goal container.document.querySelectorAll('your-selector') should return the right number of matches.<textarea> and sometimes <span> or <div> (display vs edit mode), note both.Print this or keep it open on your phone while at work.
document.querySelectorAll('...')$metadata endpoint in a new tab