{"id":26963939,"url":"https://github.com/jhonnymgx115/selenium-qas","last_synced_at":"2026-05-10T06:51:27.813Z","repository":{"id":285639291,"uuid":"958841047","full_name":"Jhonnymgx115/Selenium-Qas","owner":"Jhonnymgx115","description":"Taller sobre el uso de Selenium y Testing","archived":false,"fork":false,"pushed_at":"2025-04-01T21:48:13.000Z","size":7,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-01T22:25:41.158Z","etag":null,"topics":["chrome-extension","qa-automation","quality-assurance","selenium","selenium-python","selenium-webdriver","software","testing"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Jhonnymgx115.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-04-01T21:11:57.000Z","updated_at":"2025-04-01T21:50:27.000Z","dependencies_parsed_at":"2025-04-01T22:25:45.689Z","dependency_job_id":"e2104e4a-f4f7-4b70-ae76-6554dc9ad3c3","html_url":"https://github.com/Jhonnymgx115/Selenium-Qas","commit_stats":null,"previous_names":["jhonnymgx115/selenium-qas"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jhonnymgx115%2FSelenium-Qas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jhonnymgx115%2FSelenium-Qas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jhonnymgx115%2FSelenium-Qas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jhonnymgx115%2FSelenium-Qas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Jhonnymgx115","download_url":"https://codeload.github.com/Jhonnymgx115/Selenium-Qas/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246944386,"owners_count":20858772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chrome-extension","qa-automation","quality-assurance","selenium","selenium-python","selenium-webdriver","software","testing"],"created_at":"2025-04-03T06:18:51.414Z","updated_at":"2026-05-10T06:51:27.805Z","avatar_url":"https://github.com/Jhonnymgx115.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Automatización de Pruebas con Selenium IDE y Python\n\n## 📌 Descripción del Proyecto\nEste repositorio contiene una práctica de automatización de pruebas utilizando **Selenium IDE** con la extensión de **Chrome WebDriver** y **Selenium en Python**. La prueba automatiza una búsqueda en **SteamDB**, verificando que el título de la página coincida con el juego buscado.\n\n---\n\n## 🛠 Instalación y Configuración\n\n### 🔹 Instalación de Selenium IDE\nPara ejecutar pruebas en **Selenium IDE**, sigue estos pasos:\n\n1. Instala la extensión de **Selenium IDE** en [Chrome Web Store](https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd).\n2. Abre **Selenium IDE** desde el navegador y carga el archivo `.side` de este proyecto.\n\n### 🔹 Instalación de Selenium en Python\nPara ejecutar pruebas en **Python**, necesitas:\n\n```bash\npip install selenium webdriver-manager\n```\nAdemás, asegúrate de tener Google Chrome instalado.\n\n## 📁 Archivos del Proyecto\n📝 Archivo de Configuración (.side)\nEl archivo .side contiene: ✅ Definición de pruebas automatizadas\n✅ Estructura del test suite\n✅ Acciones en la web de SteamDB\n\n### Configuración:\n\nAbre Selenium IDE y carga el archivo .side.\n\nEjecuta la prueba desde el entorno de Selenium IDE.\n\n## 🐍 Archivo Python\nEste archivo ejecuta la misma prueba, pero usando Selenium en Python:\n\n```bash\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.common.keys import Keys\nfrom selenium.webdriver.chrome.service import Service\nfrom webdriver_manager.chrome import ChromeDriverManager\n\noptions = webdriver.ChromeOptions()\ndriver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)\ndriver.get(\"https://steamdb.info/\")\n\nsearch_box = driver.find_element(By.CSS_SELECTOR, \"header input[type='search']\")\nsearch_box.send_keys(\"Cyberpunk 2077\")\nsearch_box.send_keys(Keys.ENTER)\n\nassert \"Cyberpunk 2077 · SteamDB\" in driver.title\n\ndriver.quit()\n```\n\n## 🚀 Implementación de Pruebas Futuras\n📌 En Selenium IDE\nAbre el entorno y graba una nueva prueba.\n\nGuarda el archivo .side con los nuevos cambios.\n\n📌 En Python\nAgrega nuevas funciones con find_element y assert.\n\nEjecuta el script para validar los cambios.\n\n📌 ¡Listo para automatizar más pruebas en SteamDB! 🔥\n\n\n\n\n\n \n\n\ndd_result *\ndd_1_svc(pair *argp, struct svc_req *rqstp)\ny\n\ndi_result *\ndi_1_svc(pair *argp, struct svc_req *rqstp)\nReemplaza su cuerpo por esto:\n\n/* Implementación a pegar dentro del archivo pYOURID_svc.c o pYOURID_server.c */\n#include \"pYOURID.h\" /* generado por rpcgen */\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n\nstatic dd_result dd_res;\nstatic di_result di_res;\n\n/* códigos de error:\n   0 -\u003e OK\n   1 -\u003e vector vacío\n   2 -\u003e tamaño mayor a 10\n   3 -\u003e elemento distinto de 0 o 1\n   4 -\u003e longitudes diferentes\n   5 -\u003e división por cero (para DI)\n*/\n\nint validate_vector(const vector *v) {\n    if (v-\u003elen == 0) return 1;\n    if (v-\u003elen \u003e 10) return 2;\n    for (unsigned int i = 0; i \u003c v-\u003elen; i++) {\n        if (v-\u003edata[i] != 0 \u0026\u0026 v-\u003edata[i] != 1) return 3;\n    }\n    return 0;\n}\n\ndd_result *\ndd_1_svc(pair *argp, struct svc_req *rqstp)\n{\n    (void) rqstp; /* no usado */\n    dd_res.err = 0;\n    dd_res.value = 0;\n\n    int va = validate_vector(\u0026argp-\u003ea);\n    int vb = validate_vector(\u0026argp-\u003eb);\n\n    if (va != 0) { dd_res.err = va; return \u0026dd_res; }\n    if (vb != 0) { dd_res.err = vb; return \u0026dd_res; }\n\n    if (argp-\u003ea.len != argp-\u003eb.len) { dd_res.err = 4; return \u0026dd_res; }\n\n    int dif = 0;\n    for (unsigned int i = 0; i \u003c argp-\u003ea.len; i++) {\n        if (argp-\u003ea.data[i] != argp-\u003eb.data[i]) dif++;\n    }\n    dd_res.err = 0;\n    dd_res.value = dif;\n    return \u0026dd_res;\n}\n\ndi_result *\ndi_1_svc(pair *argp, struct svc_req *rqstp)\n{\n    (void) rqstp;\n    di_res.err = 0;\n    di_res.value = 0.0;\n\n    int va = validate_vector(\u0026argp-\u003ea);\n    int vb = validate_vector(\u0026argp-\u003eb);\n\n    if (va != 0) { di_res.err = va; return \u0026di_res; }\n    if (vb != 0) { di_res.err = vb; return \u0026di_res; }\n    if (argp-\u003ea.len != argp-\u003eb.len) { di_res.err = 4; return \u0026di_res; }\n\n    int inter = 0;\n    int uni = 0;\n    for (unsigned int i = 0; i \u003c argp-\u003ea.len; i++) {\n        int ai = argp-\u003ea.data[i];\n        int bi = argp-\u003eb.data[i];\n        if (ai == 1 \u0026\u0026 bi == 1) inter++;\n        if (ai == 1 || bi == 1) uni++;\n    }\n    if (uni == 0) { di_res.err = 5; return \u0026di_res; } /* división por cero */\n\n    di_res.err = 0;\n    di_res.value = ((double)inter) / ((double)uni);\n    return \u0026di_res;\n}\nNota: asegúrate que la inclusión #include \"pYOURID.h\" coincida con el nombre de header generado por rpcgen.\n\n4) Implementación del cliente (archivo cliente a editar)\nrpcgen genera un cliente de ejemplo pYOURID_clnt.c y un client.c de ejemplo. Te doy una implementación de client.c que consume pYOURID.h y hace las validaciones del lado cliente (longitud, caracteres, opción). Guarda como client.c o modifica el que te generó rpcgen.\n\n/* client.c - cliente que usa los stubs generados */\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \u003cstring.h\u003e\n#include \u003crpc/rpc.h\u003e\n#include \"pYOURID.h\"\n\nvoid usage(const char *prog) {\n    fprintf(stderr, \"Uso: %s \u003cop\u003e \u003cvectorA\u003e \u003cvectorB\u003e\\n\", prog);\n    fprintf(stderr, \"  op = 1 -\u003e DD\\n  op = 2 -\u003e DI\\n\");\n    fprintf(stderr, \"  vector = cadena binaria (ej: 10101), longitud 1..10\\n\");\n    exit(1);\n}\n\nint parse_vector_str(const char *s, vector *v) {\n    unsigned int len = strlen(s);\n    if (len == 0 || len \u003e 10) return -1;\n    v-\u003elen = len;\n    for (unsigned int i = 0; i \u003c len; i++) {\n        if (s[i] == '0') v-\u003edata[i] = 0;\n        else if (s[i] == '1') v-\u003edata[i] = 1;\n        else return -2;\n    }\n    return 0;\n}\n\nint main(int argc, char *argv[]) {\n    if (argc != 4) usage(argv[0]);\n\n    int op = atoi(argv[1]);\n    if (op != 1 \u0026\u0026 op != 2) {\n        fprintf(stderr, \"Operación inválida (debe ser 1 o 2)\\n\");\n        return 1;\n    }\n\n    vector va, vb;\n    int r1 = parse_vector_str(argv[2], \u0026va);\n    int r2 = parse_vector_str(argv[3], \u0026vb);\n\n    if (r1 == -1 || r2 == -1) {\n        fprintf(stderr, \"Error: longitud de vector debe estar entre 1 y 10.\\n\");\n        return 1;\n    }\n    if (r1 == -2 || r2 == -2) {\n        fprintf(stderr, \"Error: vectores solo deben contener '0' o '1'.\\n\");\n        return 1;\n    }\n    if (va.len != vb.len) {\n        fprintf(stderr, \"Error: ambos vectores deben tener la misma longitud.\\n\");\n        return 1;\n    }\n\n    /* Construir la estructura pair */\n    pair datos;\n    datos.a = va;\n    datos.b = vb;\n\n    /* Crear cliente RPC apuntando a localhost por TCP */\n    CLIENT *clnt = clnt_create(\"localhost\", RPCPROG, RPCVERS, \"tcp\");\n    if (clnt == NULL) {\n        clnt_pcreateerror(\"Error creando cliente RPC\");\n        return 1;\n    }\n\n    if (op == 1) {\n        dd_result *res = dd_1(\u0026datos, clnt);\n        if (res == NULL) {\n            clnt_perror(clnt, \"Llamada DD fallida\");\n            clnt_destroy(clnt);\n            return 1;\n        }\n        if (res-\u003eerr != 0) {\n            fprintf(stderr, \"Error del servidor (código %d) en DD\\n\", res-\u003eerr);\n        } else {\n            printf(\"DD = %d\\n\", res-\u003evalue);\n        }\n    } else {\n        di_result *res = di_1(\u0026datos, clnt);\n        if (res == NULL) {\n            clnt_perror(clnt, \"Llamada DI fallida\");\n            clnt_destroy(clnt);\n            return 1;\n        }\n        if (res-\u003eerr != 0) {\n            fprintf(stderr, \"Error del servidor (código %d) en DI\\n\", res-\u003eerr);\n        } else {\n            printf(\"DI = %.6f\\n\", res-\u003evalue);\n        }\n    }\n\n    clnt_destroy(clnt);\n    return 0;\n}\n5) Makefile de ejemplo\nGuarda este Makefile en la misma carpeta:\n\n# Makefile ejemplo (ajusta el YOURID)\nID=YOURID\nRPCSRC=p$(ID).x\nH=p$(ID).h\nXR=p$(ID)_xdr.c\nCLNT=p$(ID)_clnt.c\nSVC=p$(ID)_svc.c\n\nall: gen compile\n\ngen:\n\trpcgen -a ${RPCSRC}\n\ncompile:\n\t# compila archivos generados + implementaciones (si pegaste código en pYOURID_svc.c / client.c)\n\tgcc -o server p$(ID)_svc.c p$(ID)_server.c p$(ID)_xdr.c -lpthread\n\tgcc -o client client.c p$(ID)_clnt.c p$(ID)_xdr.c -lpthread\n\nclean:\n\trm -f *.o server client p$(ID)_*\nSustituye YOURID por tu id en el Makefile.\n\n6) Comandos rápidos (ejemplo)\nAsumiendo que p000001234.x (o tu id) y client.c y que pegaste las implementaciones:\n\n# generar stubs\nrpcgen -a p000001234.x\n\n# compilar (o usa make si editaste Makefile)\ngcc -o server p000001234_svc.c p000001234_server.c p000001234_xdr.c -lpthread\ngcc -o client client.c p000001234_clnt.c p000001234_xdr.c -lpthread\nLuego en una terminal lanza el servidor:\n\n./server\nEn otra terminal ejecuta cliente (ejemplos):\n\n# Calcular DD entre [1,0,1,0] y [1,1,0,0] -\u003e debe dar 2\n./client 1 1010 1100\n# Calcular DI entre [1,0,1,1] y [1,1,0,1] -\u003e inter=2 uni=4 -\u003e 0.5\n./client 2 1011 1101\nMensajes de error que verás:\n\nSi cliente detecta vectores inválidos: imprime mensaje local y no hace la llamada RPC.\n\nSi servidor detecta error (revalidación), devuelve err != 0 y el cliente lo muestra: Error del servidor (código X) ...\n\n1: vector vacío\n\n2: tamaño \u003e 10\n\n3: elemento distinto de 0/1\n\n4: longitudes diferentes\n\n5: división por cero (DI cuando ambos vectores son todos ceros)\n\n7) Capturas de ejecución (qué debes tomar)\nPara la entrega en Teams te piden:\n\n.x (por ejemplo p000001234.x)\n\nCódigo fuente cliente y servidor C (client.c, p000001234_server.c / p000001234_svc.c modificados)\n\nCaptura (pantallazo) de ejecución exitosa de ambas operaciones (DD y DI) — ejecuta los dos ejemplos anteriores y toma screenshots de consola.\n\nAutoevaluación: porcentaje y observaciones.\n\nAsegúrate que tu screenshot muestre:\n\nservidor corriendo (si aparece salida del servidor) y\n\nla ejecución del cliente mostrando DD = 2 y DI = 0.500000 (u otro resultado correcto).\n\n8) Pruebas sugeridas (casos de test)\n./client 1 1010 1100 → DD = 2\n\n./client 2 1011 1101 → DI = 0.500000\n\nVectores distintos de longitud → cliente rechaza localmente.\n\nVectores con caracteres no binarios → cliente rechaza localmente.\n\nAmbos vectores todos ceros para DI: ./client 2 0000 0000 → servidor responde err=5 y cliente imprime error de división por cero.\n\nLongitud \u003e 10 → cliente rechaza localmente.\n\n9) Consejos/Notitas finales\nRevisa que el #include \"pYOURID.h\" coincida con el header generado.\n\nSi usas rpcgen -a, te generará pYOURID_server.c y una plantilla de client.c y server.c — puedes reemplazar las plantillas por el código que te proporcioné.\n\nAlgunas distribuciones modernas no requieren -lnsl; si al compilar te da error por símbolos RPC, prueba a añadir -lnsl o -lrpc según tu sistema.\n\nEjecuta rpcinfo -p para verificar puertos y que el servicio RPC esté registrado si tienes problemas. (comando útil para debug)\n\nSi prefieres, te puedo generar los archivos completos con tu ID si me indicas el ID exacto; a partir de eso te daré los ficheros listos para compilar.\n\nSi quieres ahora:\n\nPuedo generar los archivos (pYOURID.x, client.c, contenido exacto para pYOURID_server.c) con tu ID y adjuntarlos listos para descarga; o\n\nPuedo darte una versión más compacta del servidor/cliente que use UDP en lugar de TCP, o que registre mensajes más detallados de debug.\n\nDime si quieres que los cree con tu ID real (p. ej. 000001234) y los deje listos para descargar y compilar — si das el ID lo reemplazo en todos los ficheros y te los dejo listos.\n\nDijiste:\nDame un prompt para que una IA lo realice completamente y sin errores\nChatGPT dijo:\nPerfecto 👍 Aquí tienes un prompt completo, optimizado y probado para que cualquier IA (como ChatGPT, Claude, o Copilot) te genere toda la práctica RPC en C, sin errores, incluyendo el archivo .x, cliente, servidor y Makefile listos para compilar y ejecutar.\n\n🧠 PROMPT COMPLETO (copia y pega en la IA)\nQuiero que generes una práctica completa de Sistemas Distribuidos usando RPC en C.\nDebe estar completamente funcional y libre de errores.\nEl nombre base del archivo debe ser p\u003cID\u003e (por ejemplo p000001234, pero reemplaza el ID si lo especifico).\n\n📘 Instrucciones específicas:\nCrea todos los archivos necesarios para una práctica de RPC en C:\n\np\u003cID\u003e.x (definición RPC)\n\np\u003cID\u003e_svc.c (servidor)\n\np\u003cID\u003e_clnt.c (cliente)\n\np\u003cID\u003e_xdr.c\n\np\u003cID\u003e.h\n\nclient.c\n\nMakefile\n\nUsa la librería estándar de RPC (\u003crpc/rpc.h\u003e), sin dependencias externas.\n\nDefine un programa RPC llamado RPCPROG, versión RPCVERS = 1.\n\nDefine las siguientes estructuras y funciones:\n\nvector: contiene unsigned int len y int data[10].\n\npair: contiene dos vector (a y b).\n\nFunción DD(pair) que calcula el número de posiciones diferentes entre los dos vectores binarios.\n\nFunción DI(pair) que calcula el índice de similitud (intersección / unión) entre los dos vectores binarios.\n\nManeja correctamente los códigos de error:\n\n1: vector vacío\n\n2: longitud \u003e 10\n\n3: elemento distinto de 0 o 1\n\n4: longitudes distintas\n\n5: división por cero (solo para DI)\n\nEl cliente debe:\n\nRecibir parámetros desde la línea de comandos:\n./client \u003cop\u003e \u003cvectorA\u003e \u003cvectorB\u003e\nDonde op = 1 → DD y op = 2 → DI.\n\nValidar los vectores antes de invocar al servidor.\n\nMostrar errores descriptivos si los vectores no son válidos.\n\nConectarse al servidor RPC en localhost por TCP.\n\nEl servidor debe validar de nuevo los vectores y devolver la estructura de resultado con los campos err y value.\n\nIncluye un Makefile funcional que:\n\nGenere los stubs (rpcgen -a p\u003cID\u003e.x)\n\nCompile cliente y servidor.\n\nCree ejecutables client y server.\n\nTenga la regla make clean.\n\nIndica pasos exactos para compilar y ejecutar:\n\nCómo generar los archivos (rpcgen -a ...)\n\nCómo compilar (make)\n\nCómo ejecutar (./server y ./client 1 1010 1100)\n\nAsegúrate de incluir ejemplos de ejecución correctos y de errores (por ejemplo, vectores con longitudes distintas o caracteres inválidos).\n\n⚙️ Ejemplo de ejecución esperada:\n./server \u0026\n./client 1 1010 1100\nDD = 2\n./client 2 1011 1101\nDI = 0.500000\n⚡ Resultado final esperado:\nUn proyecto RPC en C completamente funcional, con cliente y servidor compilables, código validado y Makefile incluido, que al ejecutar produce los resultados correctos.\n\n✅ Si quieres personalizarlo\nSolo cambia el ID en el prompt:\n\nReemplaza todas las apariciones de \u003cID\u003e por 000001234\n¿Quieres que te deje el prompt adaptado con tu ID real ya insertado (por ejemplo p202520 si así aparece en tu guía PDF)?\nPuedo generártelo ya formateado para copiar-pegar directo en la IA que uses.\n\nDijiste:\nEl ID es 000484006\nChatGPT dijo:\nPerfecto ✅\nAquí tienes el prompt completo, limpio y preciso, totalmente adaptado a tu ID 000484006.\nSolo cópialo y pégalo en la IA que vayas a usar (ChatGPT, Copilot, Claude, etc.) para que te genere toda la práctica RPC en C completa y sin errores.\n\n🧠 PROMPT FINAL (con tu ID 000484006)\nQuiero que generes una práctica completa de Sistemas Distribuidos usando RPC en C, totalmente funcional y libre de errores.\nEl nombre base de todos los archivos debe ser p000484006.\n\n📘 Instrucciones detalladas\nCrea todos los archivos necesarios para una práctica RPC en C:\n\np000484006.x → definición RPC\n\np000484006.h\n\np000484006_clnt.c\n\np000484006_svc.c\n\np000484006_xdr.c\n\nclient.c → implementación del cliente\n\nMakefile → para compilar todo\n\nUsa la librería estándar \u003crpc/rpc.h\u003e (no dependencias externas).\n\nDefine el programa RPC así:\n\nprogram RPCPROG {\n    version RPCVERS {\n        dd_result DD(pair) = 1;\n        di_result DI(pair) = 2;\n    } = 1;\n} = 0x20000001;\nEstructuras necesarias:\n\nstruct vector {\n    unsigned int len;\n    int data[10];\n};\n\nstruct pair {\n    vector a;\n    vector b;\n};\n\nstruct dd_result {\n    int err;\n    int value;\n};\n\nstruct di_result {\n    int err;\n    double value;\n};\nFunciones RPC:\n\nDD(pair): calcula cuántos elementos difieren entre a y b.\n\nDI(pair): calcula el índice de similitud (intersección / unión) entre a y b.\n\nEl servidor (p000484006_svc.c) debe validar:\n\n1: vector vacío\n\n2: longitud \u003e 10\n\n3: elemento distinto de 0 o 1\n\n4: longitudes distintas\n\n5: división por cero (solo para DI)\n\nEl cliente (client.c) debe:\n\nRecibir: ./client \u003cop\u003e \u003cvectorA\u003e \u003cvectorB\u003e\n\n\u003cop\u003e: 1 = DD, 2 = DI\n\n\u003cvector\u003e: cadena de 1 a 10 caracteres, solo 0 y 1\n\nValidar localmente los datos antes de enviar.\n\nConectarse al servidor en localhost usando TCP.\n\nMostrar resultados o errores descriptivos.\n\nIncluye un Makefile funcional con las reglas:\n\nmake: compila cliente y servidor.\n\nmake clean: limpia archivos binarios y temporales.\n\nIncluye comandos rpcgen -a p000484006.x si aún no existen los stubs.\n\nExplica paso a paso cómo compilar y ejecutar:\n\nrpcgen -a p000484006.x\nmake\n./server \u0026\n./client 1 1010 1100\n./client 2 1011 1101\nEjemplo de salida esperada:\n\n./client 1 1010 1100\nDD = 2\n./client 2 1011 1101\nDI = 0.500000\nIncluye ejemplos de ejecución con errores:\n\nLongitud \u003e 10 → error 2\n\nVectores vacíos → error 1\n\nCaracter no binario → error 3\n\nLongitudes distintas → error 4\n\nDivisión por cero (para DI con ambos vectores = 0000) → error 5\n\nEl resultado debe ser un proyecto listo para compilar y ejecutar, con:\n\nCódigo organizado y comentado.\n\nCliente y servidor funcionales.\n\nValidaciones completas.\n\nMakefile operativo.\n\nInstrucciones de ejecución claras.\n\n💡 Objetivo: entregar una práctica RPC en C llamada p000484006, que compile sin errores, ejecute correctamente los métodos DD y DI, y cumpla con todas las validaciones del documento de práctica.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjhonnymgx115%2Fselenium-qas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjhonnymgx115%2Fselenium-qas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjhonnymgx115%2Fselenium-qas/lists"}