7a0da7932b
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Has been cancelled
Docker Tests (Consolidated) / Accessibility Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Unit Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Example Tests (push) Has been cancelled
Docker Tests (Consolidated) / Production Image Smoke Test (push) Has been cancelled
Docker Tests (Consolidated) / Infrastructure Tests (push) Has been cancelled
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Has been cancelled
Backwards Compatibility / Verify Encryption Constants (push) Has been cancelled
Backwards Compatibility / PyPI Version Compatibility (push) Has been cancelled
Backwards Compatibility / Database Migration Tests (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Docker Tests (Consolidated) / detect-changes (push) Has been cancelled
Docker Tests (Consolidated) / Build Test Image (push) Has been cancelled
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Has been cancelled
161 lines
6.2 KiB
JavaScript
161 lines
6.2 KiB
JavaScript
const puppeteer = require('puppeteer');
|
|
const AuthHelper = require('./auth_helper');
|
|
const { getPuppeteerLaunchOptions } = require('./puppeteer_config');
|
|
|
|
// Explore the settings page to find input fields
|
|
(async () => {
|
|
let browser;
|
|
|
|
try {
|
|
console.log('=== Exploring Settings Page ===');
|
|
|
|
browser = await puppeteer.launch(getPuppeteerLaunchOptions());
|
|
|
|
const page = await browser.newPage();
|
|
await page.setViewport({ width: 1920, height: 1080 });
|
|
|
|
const authHelper = new AuthHelper(page);
|
|
|
|
// Create and login user
|
|
const timestamp = Date.now();
|
|
const testUsername = `explore_test_${timestamp}`;
|
|
await authHelper.register(testUsername, 'testpass123');
|
|
|
|
console.log('User registered and logged in');
|
|
|
|
// Navigate to settings
|
|
await page.goto('http://localhost:5000/settings', { waitUntil: 'domcontentloaded' });
|
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
|
|
// Get page title
|
|
const title = await page.title();
|
|
console.log(`\nPage title: ${title}`);
|
|
|
|
// Find all forms
|
|
const forms = await page.evaluate(() => {
|
|
const formElements = document.querySelectorAll('form');
|
|
return Array.from(formElements).map((form, index) => ({
|
|
index,
|
|
id: form.id,
|
|
action: form.action,
|
|
method: form.method,
|
|
inputCount: form.querySelectorAll('input').length
|
|
}));
|
|
});
|
|
|
|
console.log(`\nFound ${forms.length} forms:`);
|
|
forms.forEach(form => {
|
|
console.log(` Form ${form.index}: id="${form.id}", action="${form.action}", method="${form.method}", inputs=${form.inputCount}`);
|
|
});
|
|
|
|
// Find all input fields
|
|
const inputs = await page.evaluate(() => {
|
|
const inputElements = document.querySelectorAll('input');
|
|
return Array.from(inputElements).map(input => ({
|
|
type: input.type,
|
|
name: input.name,
|
|
id: input.id,
|
|
placeholder: input.placeholder,
|
|
value: input.value ? (input.type === 'password' ? '***' : input.value.substring(0, 20)) : '',
|
|
dataAttributes: Object.keys(input.dataset),
|
|
visible: input.offsetParent !== null
|
|
}));
|
|
});
|
|
|
|
console.log(`\nFound ${inputs.length} input fields:`);
|
|
|
|
// Filter for API key related fields
|
|
const apiKeyFields = inputs.filter(input =>
|
|
input.name.includes('api_key') ||
|
|
input.id.includes('api_key') ||
|
|
input.placeholder?.toLowerCase().includes('api') ||
|
|
input.name.includes('openai') ||
|
|
input.id.includes('openai')
|
|
);
|
|
|
|
console.log(`\nAPI key related fields (${apiKeyFields.length}):`);
|
|
apiKeyFields.forEach(field => {
|
|
console.log(` ${field.type} - name: "${field.name}", id: "${field.id}", visible: ${field.visible}`);
|
|
if (field.dataAttributes.length > 0) {
|
|
console.log(` Data attributes: ${field.dataAttributes.join(', ')}`);
|
|
}
|
|
});
|
|
|
|
// Look for password type inputs
|
|
const passwordFields = inputs.filter(input => input.type === 'password');
|
|
console.log(`\nPassword fields (${passwordFields.length}):`);
|
|
passwordFields.forEach(field => {
|
|
console.log(` name: "${field.name}", id: "${field.id}", visible: ${field.visible}`);
|
|
});
|
|
|
|
// Check for navigation or tabs
|
|
const navLinks = await page.evaluate(() => {
|
|
const links = document.querySelectorAll('a[href*="settings"], .nav-link, .tab-link, [role="tab"]');
|
|
return Array.from(links).map(link => ({
|
|
text: link.textContent.trim(),
|
|
href: link.href,
|
|
classes: link.className
|
|
}));
|
|
});
|
|
|
|
console.log(`\nNavigation/Tab links (${navLinks.length}):`);
|
|
navLinks.forEach(link => {
|
|
if (link.text.toLowerCase().includes('llm') || link.text.toLowerCase().includes('api') || link.text.toLowerCase().includes('openai')) {
|
|
console.log(` "${link.text}" - ${link.href}`);
|
|
}
|
|
});
|
|
|
|
// Check if we need to expand any sections
|
|
const expandables = await page.evaluate(() => {
|
|
const elements = document.querySelectorAll('[data-toggle="collapse"], .collapse, .accordion-button, details');
|
|
return Array.from(elements).map(el => ({
|
|
tag: el.tagName,
|
|
text: el.textContent.substring(0, 50),
|
|
classes: el.className
|
|
}));
|
|
});
|
|
|
|
if (expandables.length > 0) {
|
|
console.log(`\nFound ${expandables.length} expandable sections`);
|
|
}
|
|
|
|
// Take screenshot
|
|
await page.screenshot({
|
|
path: `/tmp/settings_exploration_${timestamp}.png`,
|
|
fullPage: true
|
|
});
|
|
console.log(`\nScreenshot saved: /tmp/settings_exploration_${timestamp}.png`);
|
|
|
|
// Try to find LLM section and click it
|
|
const llmSection = await page.$('a[href*="llm"], [data-section="llm"], a.nav-link[href*="llm"]');
|
|
if (llmSection) {
|
|
console.log('\nFound LLM section, clicking...');
|
|
await llmSection.click();
|
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
|
|
// Re-scan for inputs after clicking
|
|
const newInputs = await page.evaluate(() => {
|
|
const inputElements = document.querySelectorAll('input[name*="openai"], input[id*="openai"]');
|
|
return Array.from(inputElements).map(input => ({
|
|
type: input.type,
|
|
name: input.name,
|
|
id: input.id,
|
|
visible: input.offsetParent !== null
|
|
}));
|
|
});
|
|
|
|
console.log(`\nOpenAI-related inputs after clicking LLM section (${newInputs.length}):`);
|
|
newInputs.forEach(field => {
|
|
console.log(` ${field.type} - name: "${field.name}", id: "${field.id}", visible: ${field.visible}`);
|
|
});
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('Error:', error.message);
|
|
} finally {
|
|
if (browser) {
|
|
await browser.close();
|
|
}
|
|
}
|
|
})();
|