WebDriverException: erro desconhecido: o arquivo DevToolsActivePort não existe ao tentar iniciar o navegador Chrome


153

Estou tentando iniciar o chrome com uma URL, o navegador é iniciado e não faz nada depois disso.

Estou vendo o erro abaixo após 1 minuto:

Unable to open browser with url: 'https://www.google.com' (Root cause: org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist
  (Driver info: chromedriver=2.39.562718 (9a2698cba08cf5a471a29d30c8b3e12becabb0e9),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information)

Minha configuração:

  • Chrome: 66
  • ChromeBrowser: 2.39.56

PS tudo funciona bem no Firefox


1
Você pode atualizar a pergunta com o código que está causando esse erro?
GPT14 01/06/19

Eu recebi este erro quando o vncserver travou e eu não tinha mais o X display
xtian

Respostas:


71

Esta mensagem de erro ...

org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist 

... implica que o ChromeDriver não conseguiu iniciar / gerar uma nova sessão do WebBrowser, ou seja, do navegador Chrome .

Seus testes de código e as informações de versão de todos os binários nos dariam alguma dica sobre o que está acontecendo de errado.

No entanto, conforme Adicionar --disable-dev-shm-use aos sinalizadores de inicialização padrão, parece que adicionar o argumento --disable-dev-shm-usagetemporariamente resolverá o problema.

Se você deseja iniciar / expandir uma nova sessão do navegador Chrome , pode usar a seguinte solução:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized"); // open Browser in maximized mode
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("--no-sandbox"); // Bypass OS security model
WebDriver driver = new ChromeDriver(options);
driver.get("https://google.com");

disable-dev-shm-use

Conforme base_switches.cc, disable-dev-shm-usage parece válido apenas no sistema operacional Linux :

#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// The /dev/shm partition is too small in certain VM environments, causing
// Chrome to fail or crash (see http://crbug.com/715363). Use this flag to
// work-around this issue (a temporary directory will always be used to create
// anonymous shared memory files).
const char kDisableDevShmUsage[] = "disable-dev-shm-usage";
#endif

Na discussão, adicione uma opção para usar / tmp em vez de / dev / shm David menciona:

Eu acho que dependeria de como são montados o / dev / shm e / tmp. Se ambos são montados como tmpfs, estou assumindo que não haverá diferença. se por algum motivo / tmp não for mapeado como tmpfs (e eu acho que é mapeado como tmpfs por padrão pelo systemd), o gerenciamento de memória compartilhada do Chrome sempre mapeia arquivos na memória ao criar arquivos compartilhados anônimos, portanto, nesse caso, não deve ser muita diferença. Eu acho que você pode forçar testes de telemetria com o sinalizador ativado e ver como vai.

Quanto ao porquê de não usar por padrão, foi adiado pela equipe de memória compartilhada, acho que faz sentido que ele esteja usando / dev / shm para memória compartilhada por padrão.

Por fim, tudo isso deve mudar para usar o memfd_create, mas acho que isso não acontecerá tão cedo, pois exigirá uma refatoração significativa do gerenciamento de memória do Chrome.


Outro

Aqui está o link para a história da Sandbox .


8
Mas o que causou esse erro específico DevToolsActivePort file doesn't existe por que ele começou a aparecer de repente?

3
Os itens de "Consideração adicional" - eles parecem bastante aplicáveis ​​a esse problema. Especialmente esse tipo de situação em que não havia sido estabelecido exatamente o que causou o problema.
Pete Kelley

5
Na parte excluída da postagem de @ DebanjanB, isso pode ser causado pelo uso de um Chromedriver que não suporta a versão do Chrome instalado. Isso pode acontecer, por exemplo, se o chrome for atualizado sem atualizar o Chromedriver.
expz 29/11

Isso costumava resolver o problema para mim, mas não no meu sistema atual (Ubuntu 18 + Python 3.7)
tw0000 19/03/19

3
Caso isso ajude mais alguém, apenas adicionar disable-dev-shm-usagenão foi suficiente. Eu também tive que adicionar --no-sandboxpara fazê-lo funcionar. Esta foi a correção completa para mim para o Selenium-java:chromeOptions.addArguments("--no-sandbox", "--disable-dev-shm-usage");
George Pantazes 08/08/19

52

Comecei a ver esse problema na segunda-feira 2018-06-04. Nossos testes são executados todos os dias da semana. Parece que a única coisa que mudou foi a versão do google-chrome (que foi atualizada para a atual) JVM e Selenium eram versões recentes na caixa Linux (Java 1.8.0_151, selenium 3.12.0, google-chrome 67.0.3396.62 e xvfb-run).
A adição específica dos argumentos " --no-sandbox " e " --disable-dev-shm-use " interrompeu o erro. Analisarei esses problemas para encontrar mais informações sobre o efeito e outras perguntas, como no que levou a atualização do google-chrome.

ChromeOptions options = new ChromeOptions();
        ...
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");

Quero esclarecer que esse código estava sendo executado todos os dias da semana em uma caixa Ubuntu Linux, mas um código equivalente na área de trabalho do Windows funcionava bem até segunda-feira. Não encontrei informações sobre para que servem as funcionalidades do arquivo DevToolsActivePort e que também seriam úteis. PK
Pete Kelley

1
Essas opções também pararam o erro. pd: usando uma pilha Rails.
Mario Pérez

Eu ainda obter [java] [1536892035.965][SEVERE]: Timed out receiving message from renderer: 60.000erros, mesmo com este
Jonathan

@Jonathan - Hi! você pode fornecer mais detalhes, como qual sistema operacional, quais versões dos componentes você está usando ou como está invocando o processo?
Pete Kelley

@Toby: Oi! Eu não quis dizer que a posição fez diferença, apenas o uso mínimo desses parâmetros. Parecia que alguns dos valores padrão em que eu confiava foram alterados quando as atualizações aconteceram. Quaisquer outros detalhes sobre o sistema ou a mensagem que você fornecer podem ajudar.
Pete Kelley

35

Estávamos tendo os mesmos problemas em nossos escravos jenkins (máquina linux) e tentamos todas as opções acima.

A única coisa que ajudou é definir o argumento

chrome_options.add_argument('--headless')

Mas quando investigamos mais, notamos que a tela XVFB não iniciava a propriedade e estava causando esse erro. Depois de corrigir a tela do XVFB, o problema foi resolvido.


2
isso resolveu meu problema, ao executar usando C # (nesse caso, a opção era assim: options.AddArgument ("- headless");
ozz

XVFB foi o problema para mim
lucaswxp 23/07

23

Eu tive o mesmo problema em python. O acima ajudou. Aqui está o que eu usei em python -

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('/path/to/your_chrome_driver_dir/chromedriver',chrome_options=chrome_options)

Resolvi meu problema com a atualização do chrome (eu já tinha o chromedrive mais recente), portanto tive que atualizar também o navegador usual.
Axel_ande 03/09/19

18

Atualizar:

Sou capaz de resolver o problema e agora consigo acessar o chrome com o URL desejado.

Resultados da tentativa das soluções fornecidas:

Tentei todas as configurações conforme fornecido acima, mas não consegui resolver o problema

Explicação sobre o problema:

Conforme minha observação, o arquivo DevToolsActivePort não existe é causado quando o chrome não consegue encontrar sua referência na pasta scoped_dirXXXXX.

Etapas tomadas para resolver o problema

  1. Eu matei todos os processos de cromo e processos de driver de cromo.
  2. Adicionado o código abaixo para chamar o chrome

    System.setProperty("webdriver.chrome.driver","pathto\\chromedriver.exe");    
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver = new ChromeDriver(options);
    driver.get(url);
    

Usando as etapas acima, consegui resolver o problema.

Obrigado por suas respostas.


3
Você sabe o que afeta o useAutomationExtension? Desativa extensões para automação (screenshots / controle etc) não? O advento do DevTools não deveria tornar essa alteração sem efeito? codereview.chromium.org/2785413002
Toby

10

Eu estava enfrentando o mesmo problema recentemente e, após algumas tentativas e erros, também funcionou para mim.

DEVE ESTAR EM CIMA:

options.addArguments("--no-sandbox"); //has to be the very first option

BaseSeleniumTests.java

public abstract class BaseSeleniumTests {

    private static final String CHROMEDRIVER_EXE = "chromedriver.exe";
    private static final String IEDRIVER_EXE = "IEDriverServer.exe";
    private static final String FFDRIVER_EXE = "geckodriver.exe";
    protected WebDriver driver;

    @Before
    public void setUp() {
        loadChromeDriver();
    }

    @After
    public void tearDown() {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }

    private void loadChromeDriver() {
        ClassLoader classLoader = getClass().getClassLoader();
        String filePath = classLoader.getResource(CHROMEDRIVER_EXE).getFile();
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        ChromeDriverService service = new ChromeDriverService.Builder()
                .usingDriverExecutable(new File(filePath))
                .build();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--no-sandbox"); // Bypass OS security model, MUST BE THE VERY FIRST OPTION
        options.addArguments("--headless");
        options.setExperimentalOption("useAutomationExtension", false);
        options.addArguments("start-maximized"); // open Browser in maximized mode
        options.addArguments("disable-infobars"); // disabling infobars
        options.addArguments("--disable-extensions"); // disabling extensions
        options.addArguments("--disable-gpu"); // applicable to windows os only
        options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
        options.merge(capabilities);
        this.driver = new ChromeDriver(service, options);
    }

}

GoogleSearchPageTraditionalSeleniumTests.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class GoogleSearchPageTraditionalSeleniumTests extends BaseSeleniumTests {

    @Test
    public void getSearchPage() {
        this.driver.get("https://www.google.com");
        WebElement element = this.driver.findElement(By.name("q"));
        assertNotNull(element);
    }

}

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

Interessante! Como você gera um arquivo .side? Isso é algo que uma pessoa de controle de qualidade faz manualmente?
Nital

Você usa o Selenium IDE para gravar um teste. O resultado é um arquivo .side. Ele roda bem usando o IDE, mas estou tentando executá-lo usando selênio-lado-corredor, mas executando todos os tipos de problemas com o chromedriver.
Pabrams 11/07/19

tem que ser a primeira opção - passar dias para encontrar esse haha
cuniculus

Obrigado! Adicionar "--no-sandbox" resolve meu problema.
matabares 4/07

7

No meu caso, no seguinte ambiente:

  • Windows 10
  • Pitão 3.7.5
  • Google Chrome versão 80 e o correspondente ChromeDriver no caminho C:\Windows
  • selênio 3.141.0

Eu precisava adicionar os argumentos --no-sandboxe --remote-debugging-port=9222o ChromeOptionsobjeto e executar o código como usuário administrador almoçando o Powershell / cmd como administrador.

Aqui está o trecho de código relacionado:

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('--disable-infobars')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_argument('--remote-debugging-port=9222')
driver = webdriver.Chrome(options=options)

1
o mesmo para mim com o docker com o ubuntu 18.04, py3.7, chrome (driver) 80
patroqueeet

Isso funcionou para mim sem mais problemas. Acabei de começar a me deparar com esse problema hoje, mas, devido à sua resposta, ele foi corrigido rapidamente! Meu ambiente é essencialmente o mesmo que o seu.
Ryan Harris

6

Eu me deparei com esse problema no Ubuntu 20 com o Python Selenium depois de baixar o chromedriver separadamente e depois usá-lo. sudo apt install chromium-browserMesmo sendo a mesma versão, isso continuava acontecendo.

Minha correção foi usar o driver chrome fornecido que acompanha o pacote repo localizado em

/snap/bin/chromium.chromedriver

driver = webdriver.Chrome(chrome_options=options, executable_path='/snap/bin/chromium.chromedriver')

4

Conforme declarado nesta outra resposta :

Esta mensagem de erro ... implica que o ChromeDriver não conseguiu iniciar / gerar uma nova sessão do WebBrowser, ou seja, do navegador Chrome.

Entre as possíveis causas, gostaria de mencionar o fato de que, caso você esteja executando um Chromium decapitado via Xvfb, talvez seja necessário exporta DISPLAYvariável: no meu caso, eu tinha no lugar (como recomendado) as opções --disable-dev-shm-usagee --no-sandbox, tudo estava funcionando bem, mas em uma nova instalação executando o Ubuntu 18.04 mais recente (no momento da redação), esse erro começou a ocorrer, e a única solução possível era executar um export DISPLAY=":20"(com o Xvfb iniciado anteriormente Xvfb :20&).


OMG Obrigado. Eu estava fazendo algumas alterações no contêiner do docker e acidentalmente deixei de fora o xvfb. Eu nunca teria encontrado isso se você não tivesse deixado aqui :-).
Ryan Shillington

3

Também enfrentei esse problema ao me integrar ao servidor jenkins, fui usado o usuário root para o trabalho jenkin, o problema foi corrigido quando mudei o usuário para outro usuário . Não sei por que esse erro ocorre para o usuário root.

  • Google Chrome versão 71.0
  • ChromeDriver versão 2.45
  • CentOS7 Versão 1.153

O usuário não root trabalhou para mim, eu tinha a versão correta do driver chrome para o cromo.
TicJit 30/06

2

No meu caso, aconteceu quando tentei usar meu perfil de usuário padrão:

...
options.addArguments("user-data-dir=D:\\MyHomeDirectory\\Google\\Chrome\\User Data");
...

Isso acionou o chrome para reutilizar processos já executados em segundo plano, de forma que o processo iniciado pelo chromedriver.exe foi encerrado.

Resolução: elimine todos os processos chrome.exe em execução em segundo plano.


Eu tive um problema semelhante, mas no linux - meus processos do Chrome não foram encerrados corretamente após a falha do script e estavam sendo reutilizados incorretamente. matá-los resolvido a questão
jeremycg

2

atualizar recursos no conf.js como

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['todo-spec.js'],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: ['--disable-gpu', '--no-sandbox', '--disable-extensions', '--disable-dev-shm-usage']
    }
  },

};

2

No meu caso, eu estava tentando criar um jar executável no sistema operacional Windows com o navegador chrome e queria executar o mesmo no modo sem cabeça na caixa unix com o CentOs nele. E eu estava apontando meu binário para um driver que eu baixei e empacotei com meu pacote. Para mim, esse problema continua ocorrendo independentemente da adição do abaixo:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
System.setProperty("webdriver.chrome.args", "--disable-logging");
System.setProperty("webdriver.chrome.silentOutput", "true");
options.setBinary("/pointing/downloaded/driver/path/in/automationsuite");
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("disable-infobars"); // disabling infobars
options.addArguments("--disable-extensions"); // disabling extensions
options.addArguments("--disable-gpu"); // applicable to windows os only
options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
options.addArguments("window-size=1024,768"); // Bypass OS security model
options.addArguments("--log-level=3"); // set log level
options.addArguments("--silent");//
options.setCapability("chrome.verbose", false); //disable logging
driver = new ChromeDriver(options);

A solução que eu tentei e trabalhei para mim é baixar o chrome e suas ferramentas na caixa VM / Unix host, instalar e apontar o binário para isso no pacote de automação e no bingo! Funciona :)

Comando de download:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

Comando de instalação:

sudo yum install -y ./google-chrome-stable_current_*.rpm

Conjunto de atualizações com o caminho binário abaixo do google-chrome:

options.setBinary("/opt/google/chrome/google-chrome");

E .. funciona!


Onde adicionamos esse código? Não vejo código C # no meu arquivo
.side

1

Eu tive o mesmo problema, mas no meu caso o chrome foi instalado anteriormente na pasta temp do usuário, depois foi reinstalado nos arquivos do programa. Portanto, qualquer solução fornecida aqui não me ajudou. Mas se fornecer o caminho para o chrome.exe tudo funcionará:

chromeOptions.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");

Espero que isso ajude alguém =)


parece exatamente o oposto da correção @shiuu abaixo #
Toby

1

Nenhuma solução funcionou para o meu. Mas aqui está uma solução alternativa:

maxcounter=5
for counter in range(maxcounter):
    try:           
        driver = webdriver.Chrome(chrome_options=options,
                          service_log_path=logfile,
                          service_args=["--verbose", "--log-path=%s" % logfile])
        break
    except WebDriverException as e:
        print("RETRYING INITIALIZATION OF WEBDRIVER! Error: %s" % str(e))
        time.sleep(10)
        if counter==maxcounter-1:
            raise WebDriverException("Maximum number of selenium-firefox-webdriver-retries exceeded.")

1

Você pode obter esse erro simplesmente por transmitir argumentos ruins ao Chrome. Por exemplo, se eu passar "headless"como argumento para o C # ChromeDriver, ele dispara muito bem. Se eu cometer um erro e usar a sintaxe errada "--headless", recebo o DevToolsActivePort file doesn't existerro.


1

Corri para o mesmo problema, estou usando o navegador UBUNTU, PYTHON e OPERA . no meu caso, o problema foi originado porque eu tinha uma versão desatualizada do operadriver.

Solução: 1. Certifique-se de instalar a versão mais recente do navegador Opera (não use o Opera Beta ou o desenvolvedor Opera); para isso, acesse o site oficial do Opera e faça o download de lá a versão mais recente do opera_stable.

  1. Instale o driver opera mais recente (se você já possui um driver opera, é necessário removê-lo primeiro, use sudo rm ...)

wget https://github.com/operasoftware/operachromiumdriver/releases/download/v.80.0.3987.100/operadriver_linux64.zip

   unzip operadriver_linux64.zip
   sudo mv operadriver /usr/bin/operadriver
   sudo chown root:root /usr/bin/operadriver
   sudo chmod +x /usr/bin/operadriver

no meu caso mais recente foi 80.0.3987 como você pode ver

  1. Além disso, eu também instalei o chromedriver (mas desde que o fiz antes do teste, não sei se é necessário) para instalar o chromedriver, siga as etapas na etapa anterior: v

  2. Aproveite e me agradeça!

Exemplo de código de selênio

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Opera()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.quit()

0

Parece que existem muitas causas possíveis para esse erro. No nosso caso, o erro ocorreu porque tínhamos as duas linhas a seguir no código:

System.setProperty("webdriver.chrome.driver", chromeDriverPath);
chromeOptions.setBinary(chromeDriverPath);

É resolvido removendo a segunda linha.


parece o oposto exato da correção @ sergiy-konoplyaniy acima: '(
Toby

No nosso setBinary, tentamos definir o driver chrome, o que parece um erro. A correção de @ sergiy-konoplyaniy define chrome.exe via setBinary.
shiuu 10/01/19

Onde você teve esse código? Tudo o que tenho é um arquivo .side e não possui código C #.
Pabrams

0

Corri o mesmo problema ao executar o Chrome via Behat / Mink e Selenium em um contêiner do Docker. Depois de algumas brincadeiras, cheguei ao seguinte, behat.ymlque fornece os switches mencionados acima. Observe que todos eles foram necessários para que eu funcionasse com êxito.

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my.app/
            default_session: selenium2
            selenium2:
                browser: chrome
                capabilities:
                    extra_capabilities:
                        chromeOptions:
                            args:
                                - "headless"
                                - "no-sandbox"
                                - "disable-dev-shm-usage"

0

No meu caso, estou em um ambiente Kubernetes em que não posso usar o TMPDIR padrão, porque ele irá preencher o diretório temporário com lixo.

Então, eu estava usando isso para usar um tmpdir diferente:

driver = new ChromeDriver(new ChromeDriverService.Builder()
                    .withEnvironment(ImmutableMap.of("TMPDIR", customTmpPath))
                    .build(), options);

Mas agora que atualizei tudo para o mais recente, isso não parece mais funcionar. Vou precisar encontrar uma nova maneira de fazer isso.


0

Isso acontece quando o chromedriver falha ao descobrir qual porta de depuração o chrome está usando.

Uma causa possível é um defeito em aberto com HKEY_CURRENT_USER \ Software \ Policies \ Google \ Chrome \ UserDataDir

Mas no meu último caso, foi outra causa não identificada.

Felizmente, a configuração do número da porta funcionou manualmente:

final String[] args = { "--remote-debugging-port=9222" };
options.addArguments(args);
WebDriver driver = new ChromeDriver(options);

2
É um porto constante? Ou onde posso procurar?
Mike Shiyan

0

Número de porta errado no meu caso. Verifique se o número da porta ao iniciar o servidor Selenium é o mesmo do seu script.


-2

Eu resolvo esse problema instalando yum -y install gtk3-devel gtk3-devel-docs", funciona ok

Meu trabalho é:

Selenium Version 3.12.0
ChromeDriver Version v2.40
Chrome 68 level

Antes:
insira a descrição da imagem aqui insira a descrição da imagem aqui

Depois de:
insira a descrição da imagem aqui insira a descrição da imagem aqui


10
Da avaliação: Não poste texto em imagens. Edite sua resposta e substitua essas imagens por texto. Obrigado
quinta-feira

1
Isso resolve o problema para alguém? Isso não resolve o problema para mim
Bendram

-2

Como essa é a mensagem mais ativa para esse tipo de erro, eu queria mencionar minha solução (depois de passar horas para corrigir isso).

No Ubuntu 18.04, usando o Chrome 70 e o Chromedriver 2.44 e o Python3, eu continuava recebendo o mesmo erro do DevToolsActivePort, mesmo quando desabilitei todas as opções listadas acima. O arquivo de log do chromedriver e o ps mostraram que o chromedriver que eu defini em chrome_options.binary_location estava em execução, mas sempre dava erro ao DevToolsActivePort. Quando removi chrome_options.binary_location = '....' e o adicionei à criação do webdriver, o fiz funcionar corretamente. webdriver.Chrome ('/ caminho para ... / chromedriver', chrome_options = chrome_options)

Obrigado a todos por seus comentários que me fazem entender e resolver o problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.